我正在设计Active Admin gem中的基本文件管理器(Asset模型)。每个资产HABTM组,反之亦然。
在我的active_admin资源资源中,我有一个我想要的过滤器 选择要过滤的多个组,所以我添加了:
filter :groups_id, :as => :check_boxes, :collection => proc {Group.all}
所有组都显示为预期的复选框。但是,如果我有asset_1,则资产_2和我将group_1分配给asset_1和asset_2,将group_2分配给asset_2,当我 按两个角色过滤,asset_2将自己列出两次。
如何限制过滤器仅使用“不同”或“唯一”资产?
我还有另一个问题,那就是我的任何范围内的过滤器根本不起作用。
答案 0 :(得分:4)
活动管理员阅读表示要添加
distinct: true
获得独特的结果。
要将其应用于活动管理员,我正在使用这样做:
controller do
def apply_filtering(chain)
@search = chain.ransack clean_search_params params[:q]
@search.result(distinct: true)
end
end
答案 1 :(得分:2)
has_and_belongs_to_many接受:uniq
选项,确保只返回uniq记录。在模型中设置它应该可以解决问题。
class MyModel
has_and_belongs_to_many :things, :uniq => true
end
答案 2 :(得分:2)
威尔的答案的快速更新。我正在运行Rails 5.0和ActiveAdmin 1.0,并且clean_search_params
返回了一个错误。但这代替了:
def apply_filtering(chain)
super
@search.result(distinct: true)
end
谢谢!
答案 3 :(得分:0)
...还有,Alex 的回答:
如果您想为应用中的所有控制器执行此操作,您可以将其添加到初始化程序(我的名为 active_admin_patches.rb
)-
# This guarantees that the results for a filtered #index page search do not appear more than once, on any #index page in the AA app
# TODO: THIS WILL PROBABLY FAIL WITH SOME FUTURE UPDATE, SO BE READY TO UPDATE IT FROM THE LATEST GEM SOURCE
module ActiveAdmin::ResourceController::DataAccess
# Applies any Ransack search methods to the currently scoped collection.
# Both `search` and `ransack` are provided, but we use `ransack` to prevent conflicts.
def apply_filtering(chain)
@search = chain.ransack(params[:q] || {})
# This is the original line
# @search.result
# This is the patch
@search.result(distinct: true)
end
end
我不确定为什么有人不想希望这是默认行为,但可能是有原因的。嗯,也许对于索引视图的列是非不同行之一的情况。是的,一定是这样。
此外,肯定会有更好的方法来减少干扰,但我很着急。 :-)