2

Мы используем ActiveAdmin для нашего административного представления, вот текущий индексный код. Модель Book извлекает данные из одной таблицы «книги» Postgres:Сортировка настраиваемого столбца в представлении индекса ActiveAdmin: объединение, группировка и счет ад

class Book < ActiveRecord::Base 

    has_many :stories, class_name: "BookStory" 

...

ActiveAdmin.register Book do 

    index do 
    column :id 
    column :title 
    column :subtitle 
    column :isbn_13 
    default_actions 
    end 
... 

Я хотел бы добавить столбец «истории», на наш взгляд индекса. «История» - это действие от пользователя, связанного с книгой. Истории хранятся в таблице «book_stories».

class BookStory < ActiveRecord::Base 

    belongs_to :user, 
    belongs_to :book, 

С SQL-точки зрения, именно так я хотел бы реализовать запрос в ActiveAdmin. Этот запрос дает мне желаемый результат в pgadmin3:

SELECT books.id,books.title,books.subtitle,books.isbn_13,COUNT(book_stories.book_id) AS count 
FROM books 
INNER JOIN book_stories ON books.id = book_stories.book_id 
GROUP BY books.id 
ORDER BY count DESC 
LIMIT 30; 

И я действительно не знаю, как реализовать Сортируемую колонку «Истории» в наш взгляд администратора. По-видимому, я могу сортировать книгу, как по их рассказам. Мне удалось показать отсчитывать истории за книгу с этим кодом, но столбец не сортируется:

ActiveAdmin.register Book do 

    index do 
    column :id 
    column :title 
    column :subtitle 
    column :isbn_13 
    column :stories do |book| 
    BookStory.joins(:book).group.where("books.id = #{book.id}").count 
    default_actions 
    end 
... 

Любые идеи?

ответ

1

Посмотрите на belongs_tocounter_cache. http://guides.rubyonrails.org/association_basics.html#counter-cache

class BookStory < ActiveRecord::Base 
    belongs_to :book, counter_cache: true 
end 

ActiveAdmin.register Book do 
    index do 
    column :id 
    column :title 
    column :subtitle 
    column :isbn_13 
    column :book_stories_count # will be sortable by default 
    default_actions 
    end 
end 
+0

Хорошо, до сих пор я обновил свою базу данных, используя грабли БД: мигрировать задачу класса AddBookStoriesColumn 0 конец КОНЕЦ конец Теперь столбец: book_stories_count здесь, но заполняются нулями. Все еще смотря, как заполнить столбец соответствующими значениями. Спасибо: – Thomas

+0

Вам нужно сделать что-то вроде этого 'Post.find_each {| post | Post.reset_counters (post.id,: comments)} ' –

0

Хорошо, это работает. Большое спасибо ! Вот мой код:

книга модель:

class Book < ActiveRecord::Base 

    has_many :stories, class_name: "BookStory" 

Книга рассказы модель:

class BookStory < ActiveRecord::Base 

    belongs_to :user, :counter_cache => true 
    belongs_to :book, :counter_cache => true 

миграция файл: вид

class AddBookStoriesCountColumn < ActiveRecord::Migration 
    def self.up 
    add_column :books, :book_stories_count, :integer, :null => false, :default => 0 
    Book.reset_column_information 
    Book.find_each do |b| 
     Book.reset_counters b.id, :stories 
    end 
    end 

    def self.down 
    remove_column :books, :book_stories_count 
    end 
end 

индекса:

ActiveAdmin.register Book do 

    index do 
    column :id 
    column :title 
    column :subtitle 
    column :isbn_13 
    column :book_stories_count 
    default_actions 
    end 

Я также создал задачу граблей вручную обновлять счетчик, если это необходимо:

task :update_counters => [:environment] do 
    Book.reset_column_information 
    Book.find_each do |b| 
     Book.reset_counters b.id, :stories 
    end 

Теперь я хотел бы реализовать истории счетчик для пользователей. И я полагал, что мне просто нужно будет использовать тот же код здесь, просто изменив «Книгу» на «Пользователь», но у меня есть еще одна проблема.

модель Пользователь:

class User < ActiveRecord::Base 

    has_many :book_actions 
    has_many :book_stories 
    has_many :books, through: :book_stories 

но я encouter ошибку, когда я пытаюсь обновить/сбросить счетчик

NoMethodError: undefined method `options' for nil:NilClass 

Тем не менее расследование ...

Смежные вопросы