如何通过连接表过滤ActiveAdmin索引列表?

时间:2014-01-09 19:37:32

标签: ruby-on-rails ruby activeadmin ransack

我们说我有一个表posts,另一个表reviews有一个post_id和一个rating(整数)。

如何向app/admin/post.rb添加过滤器,以返回具有特定总分的帖子? (例如SUM(reviews.rating)GROUP BY(posts.id))。我希望过滤器显示在索引的右侧,以及其他过滤器,理想情况下用作范围输入。

要明确的是,当我说"过滤"时,我的意思是ActiveAdmin filter方法,它将过滤器添加到索引页面的右侧边栏。

我在Post创建了一个范围,用于返回包含分数的帖子,但我还没有找到在ActiveAdmin过滤器中使用该方法的方法。

注意:我重写了我的例子,因为我的原始版本没有捕捉到问题的复杂性。

3 个答案:

答案 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

每次为该帖子创建评论时,该列都会更新。这也有助于提高搜索性能。