我们说我有一个表posts
,另一个表reviews
有一个post_id
和一个rating
(整数)。
如何向app/admin/post.rb
添加过滤器,以返回具有特定总分的帖子? (例如SUM(reviews.rating)GROUP BY(posts.id))。我希望过滤器显示在索引的右侧,以及其他过滤器,理想情况下用作范围输入。
要明确的是,当我说"过滤"时,我的意思是ActiveAdmin filter
方法,它将过滤器添加到索引页面的右侧边栏。
我在Post
创建了一个范围,用于返回包含分数的帖子,但我还没有找到在ActiveAdmin过滤器中使用该方法的方法。
注意:我重写了我的例子,因为我的原始版本没有捕捉到问题的复杂性。
答案 0 :(得分:3)
我还没有找到解决这个问题的正确方法,但我找到了解决方法。
我可以根据查询参数更改scoped_collection,并在我想使用它时简单地传递参数。例如,如果我有一个范围with_rating(x),它返回得分至少为x的帖子,我可以写:
controller do
def scoped_collection
if params[:with_rating]
super.with_rating(params[:with_rating])
else
super
end
end
end
然后我可以转到/admin/posts?with_rating=100
并找回评分至少为100的帖子。
感谢@seanlinsley让我了解我在此解决方案中使用的scoped_collection
方法。
答案 1 :(得分:2)
提高效果common to override scoped_collection
to join associated records:
ActiveAdmin.register Post do
controller do
def scoped_collection
super.includes :author, :publisher
end
end
end
由于整个集合现在包含作者和发布者,因此您可以使用查询范围:
scope :random_house do |scope|
scope.where publishers: {name: 'Random House'}
end
答案 2 :(得分:0)
使用计数器缓存列存储注释计数
http://railscasts.com/episodes/23-counter-cache-column
每次为该帖子创建评论时,该列都会更新。这也有助于提高搜索性能。