Ruby on Rails Active Admin - 显示HABTM的重复记录

时间:2012-02-04 01:26:05

标签: ruby-on-rails ruby activeadmin

我正在设计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将自己列出两次。

如何限制过滤器仅使用“不同”或“唯一”资产?

我还有另一个问题,那就是我的任何范围内的过滤器根本不起作用。

4 个答案:

答案 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

我不确定为什么有人不想希望这是默认行为,但可能是有原因的。嗯,也许对于索引视图的列是非不同行之一的情况。是的,一定是这样。

此外,肯定会有更好的方法来减少干扰,但我很着急。 :-)