简体   繁体   中英

How can I filter ActiveAdmin index listings by a join table?

Let's say I have a table posts , and another table reviews that has a post_id and a rating (integer).

How can I add a filter to app/admin/post.rb which returns posts with a certain total score? (eg SUM(reviews.rating) GROUP BY (posts.id)). I want the filter to show up on the right side of the index, along with the other filters, and ideally to function as a range input.

To be clear, when I say "filter", I mean the ActiveAdmin filter method which adds filters to the right sidebar on the index page.

I created a scope in Post which returns posts with scores, but I haven't been able to find a way to use that in an ActiveAdmin filter.

Note: I rewrote my example because my original one didn't capture the complexity of the question.

I haven't come up with a proper solution to this question, but I have found a workaround.

I can change the scoped_collection based on a query param, and simply pass the param in when I want to use it. For example, if I have a scope with_rating(x), which returns posts with a score of at least x, I can write:

controller do
  def scoped_collection
    if params[:with_rating]
      super.with_rating(params[:with_rating])
    else
      super
    end
  end
end

Then I can go to /admin/posts?with_rating=100 and get back posts with a rating of at least 100.

Thanks to @seanlinsley for making me aware of the scoped_collection method that I used in this solution.

It's common to override scoped_collection to join associated records to increase performance:

ActiveAdmin.register Post do
  controller do
    def scoped_collection
      super.includes :author, :publisher
    end
  end
end

Since the entire collection now has author and publisher included, you can have a scope that queries those:

scope :random_house do |scope|
  scope.where publishers: {name: 'Random House'}
end

Use counter cache column to store the comments count

http://railscasts.com/episodes/23-counter-cache-column

Then the column will get updated each time a comment is created to that post.This would also help in increasing the performance of search.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM