johnnymire
johnnymire

Reputation: 1103

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.

Upvotes: 6

Views: 3454

Answers (2)

fabien-michel
fabien-michel

Reputation: 2202

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

Upvotes: -2

Charles Maresh
Charles Maresh

Reputation: 3373

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

Upvotes: 14

Related Questions