简体   繁体   中英

Active Admin - filter by presence of has_many association

I have a User model that has_many photos. I'm looking to set up a checkbox filter in Active Admin to filter those users who have photos. Basically where the photos association is present.

class User < ActiveRecord::Base
  has_many :photos
end

Is there an easy way to do this? I know you can filter by users who have a certain photo etc. but I haven't seen an example where you can filter by presence.

Finding the correct incantation of Ransack search methods is tricky. To search where the photos.id IS NOT NULL can be accomplished with the following filter:

ActiveAdmin.register User do
  # Filter users where photos.id is not null
  filter :photos_id_not_null, label: "With Photos", as: :boolean 
end

Solution that work for me :

Insert in model :

ransacker :has_photos do |parent|
  Arel.sql("(select exists (SELECT 1 FROM photos WHERE photos.parent_id = parents.id))")
end

Then use it in activeadmin filter :

filter :has_photos_true, as: :boolean

Find ref-1 & ref-2 .

Another version if you have a counter cache:

ransacker :has_photos do |parent|
  Arel.sql("#{parent.table.name}.report_files_count > 0")
end

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