【问题标题】:Ruby on Rails Active Admin - Duplicate Records showing for HABTMRuby on Rails Active Admin - 显示 HABTM 的重复记录
【发布时间】:2012-02-04 01:26:05
【问题描述】:

我正在 Active Admin gem 中设计一个基本的文件管理器(资产模型)。每个资产 HABTM 组,反之亦然。

在我的 active_admin 资产资源中,我有一个过滤器,我希望能够 选择多个要过滤的组,所以我添加了:

filter :groups_id, :as => :check_boxes, :collection => proc {Group.all}

所有组都按预期显示为复选框。但是,如果我有asset_1、asset_2 并且我将group_1 分配给asset_1 和asset_2,并且将group_2 分配给asset_2,那么当我 按两个角色过滤,asset_2 两次列出自己。

如何限制过滤器只使用要返回的“不同”或“独特”资产?

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

【问题讨论】:

    标签: ruby-on-rails ruby activeadmin


    【解决方案1】:

    Will 回答的快速更新。我正在运行 Rails 5.0 和 ActiveAdmin 1.0,clean_search_params 返回了一个错误。但这反而奏效了:

    def apply_filtering(chain)
      super
      @search.result(distinct: true)
    end
    

    谢谢!

    【讨论】:

    • 非常感谢!!下一个技巧将是弄清楚如何将其设为所有控制器的默认值...
    【解决方案2】:

    active admin read 表示添加

    distinct: true 
    

    获得独特的结果。

    要将其应用于活动管理员,我正在使用这样做:

    controller do
      def apply_filtering(chain)
         @search = chain.ransack clean_search_params params[:q]
         @search.result(distinct: true)
       end
    end
    

    【讨论】:

    • 感谢您的回答,虽然我认为这个功能在 2012 年问这个问题时不存在 :(
    • 不用担心。我放在这里部分是为了我自己的参考。一定会经常出现。
    • 最新版本的 ActiveAdmin 从 clean_search_params 方法中删除了参数。所以该行现在应该是@search = chain.ransack clean_search_params
    【解决方案3】:

    has_and_belongs_to_many 接受:uniq 选项,确保只返回 uniq 记录。在你的模型中设置它应该可以解决问题。

    class MyModel
      has_and_belongs_to_many :things, :uniq => true
    end
    

    【讨论】:

    • 刚刚试了一下,重启了rails服务器,还是有同样的问题。我在 Asset 和 Group 模型中都添加了 :uniq 选项。
    • 我并不是要指手画脚,因为我很可能在这里做一些愚蠢的简单错误,但这似乎是 ActiveAdmin 中的一个错误???即使我只有 1 个资产,如果我将其分配给 2+ 个组,然后在过滤器侧边栏中勾选这 2+ 个组的复选框,则 1 个资产将显示 2 次以上。见:i.imgur.com/GbntK.png
    • 是的,我认为这是目前 Active Admin 中的 HABTM 关系的错误。复选框将 &q[groups_id_in][]=1&q[groups_id_in][]=2 附加到 URL 中的查询字符串参数。这似乎强制使用 Assets.where(:group_id => 1) 和 Assets.where(:group_id => 2),从而多次返回相同的条目。
    • 如果 cmets 表明它不起作用,为什么将其标记为答案? github上有AA问题吗? @professormeowingtons
    【解决方案4】:

    ...而且,快速添加 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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多