【问题标题】:Sortable custom column in ActiveAdmin index view : joins, group and count hellActiveAdmin 索引视图中的可排序自定义列:加入、分组和计数地狱
【发布时间】:2015-08-27 15:14:04
【问题描述】:

我们在管理视图中使用 ActiveAdmin,这是当前的索引代码。 Book 模型从单个“books”postgres 表中检索数据:

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
...

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord activeadmin


    【解决方案1】:

    查看belongs_to counter_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
    

    【讨论】:

    • 好的,到目前为止,我已经使用 rake db:migrate 任务类 AddBookStoriesColumn 0 end end end 现在 :book_stories_count 列在此处,但填充为零。仍在寻找如何用正确的值填充列。谢谢:
    • 你需要这样做Post.find_each { |post| Post.reset_counters(post.id, :comments) }
    【解决方案2】:

    好的,它正在工作。非常感谢你 !这是我的代码:

    图书模型:

    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
    

    如果需要,我还创建了一个 rake 任务来手动更新计数器:

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

    现在,我想为用户实现一个故事计数器。而且我相信我只需要在这里使用相同的代码,只需将“Book”更改为“User”,但我还有另一个问题。

    用户模型:

    class User < ActiveRecord::Base
    
      has_many :book_actions
      has_many :book_stories
      has_many :books, through: :book_stories
    

    但是当我尝试更新/重置计数器时遇到错误

    NoMethodError: undefined method `options' for nil:NilClass
    

    还在调查中……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2014-05-28
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多