活跃的管理员 - 按 has_many 关联的存在过滤
Active Admin - filter by presence of has_many association
我有一个 User
模型,可以 has_many 照片。我想在 Active Admin 中设置一个复选框过滤器来过滤那些有照片的用户。基本上照片协会存在的地方。
class User < ActiveRecord::Base
has_many :photos
end
有没有简单的方法来做到这一点?我知道您可以按拥有特定照片等的用户进行过滤,但我还没有看到可以按在线状态进行过滤的示例。
找到 Ransack 搜索方法的正确咒语很棘手。要搜索可以使用以下过滤器完成 photos.id IS NOT NULL
的位置:
ActiveAdmin.register User do
# Filter users where photos.id is not null
filter :photos_id_not_null, label: "With Photos", as: :boolean
end
适合我的解决方案:
插入模型:
ransacker :has_photos do |parent|
Arel.sql("(select exists (SELECT 1 FROM photos WHERE photos.parent_id = parents.id))")
end
然后在 activeadmin 过滤器中使用它:
filter :has_photos_true, as: :boolean
另一个版本,如果你有计数器缓存:
ransacker :has_photos do |parent|
Arel.sql("#{parent.table.name}.report_files_count > 0")
end
我有一个 User
模型,可以 has_many 照片。我想在 Active Admin 中设置一个复选框过滤器来过滤那些有照片的用户。基本上照片协会存在的地方。
class User < ActiveRecord::Base
has_many :photos
end
有没有简单的方法来做到这一点?我知道您可以按拥有特定照片等的用户进行过滤,但我还没有看到可以按在线状态进行过滤的示例。
找到 Ransack 搜索方法的正确咒语很棘手。要搜索可以使用以下过滤器完成 photos.id IS NOT NULL
的位置:
ActiveAdmin.register User do
# Filter users where photos.id is not null
filter :photos_id_not_null, label: "With Photos", as: :boolean
end
适合我的解决方案:
插入模型:
ransacker :has_photos do |parent|
Arel.sql("(select exists (SELECT 1 FROM photos WHERE photos.parent_id = parents.id))")
end
然后在 activeadmin 过滤器中使用它:
filter :has_photos_true, as: :boolean
另一个版本,如果你有计数器缓存:
ransacker :has_photos do |parent|
Arel.sql("#{parent.table.name}.report_files_count > 0")
end