【问题标题】:Filter on multi-select on Active Admin (Rails 3.2/postgreSQL/active admin 1.0)在 Active Admin 上过滤多选(Rails 3.2/postgreSQL/active admin 1.0)
【发布时间】:2013-12-13 19:35:43
【问题描述】:

我在尝试过滤 Active Admin 上的资源时遇到问题。

当我将过滤器应用于标准内容时,过滤器实际上工作得很好,但这里是多选

在我的 Deals 模型中确实如此:有一个“Deal_goal”属性,我可以选择多个 Deal_goal,例如“获取新用户”或“产生嗡嗡声”

这是我在活动管理表单中的输入方式:

f.input :deal_goal,
        :label      => "Deal goals",
        :as         => :select,
        :multiple   => true,
        :collection => DEAL_GOALS

为了进行多选,我在我的 Deal 模型上对其进行序列化

app/models/deal.rb

class Deal < ActiveRecord::Base
  serialize :deal_goal, Array 

我也在使用staal.io advice for multi-selects(“选择的”宝石)

我没有做的是在我的索引页面(交易列表)上,对我的 Deal_goal 属性进行过滤,如果可能的话,在此处进行多选,使我能够根据不止一种类型的交易进行过滤目标(例如:过滤与目标#1 或目标#3 的交易)

我在 admin/deal.rb 上尝试了以下两种方法,但都没有成功!

filter :deal_goal,    :as => :select, :collection => DEAL_GOALS
filter :deal_goal,    :as => :multiple_select, :collection => DEAL_GOALS

有人知道吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activeadmin


    【解决方案1】:

    您可以像在表单中一样使用multiple: true 创建多项选择:

    filter :deal_goal, as: :select, collection: DEAL_GOALS, multiple: true
    

    更新

    可以从 Active Admin / Ransack 查询 PostgreSQL 数组,只是需要多做一些工作。首先,您应该将postgres_ext gem 添加到您的Gemfile。它为您提供了一组不错的查询方法,您可以像这样使用它们:

    User.where.contains roles: ['foo']
    # or:
    User.where User.arel_table[:roles].contains ['foo']
    

    下一步是告诉 Ransack 这些查询方法(或“谓词”)存在。将其放入初始化程序中:

    # https://github.com/activerecord-hackery/ransack/issues/321
    Ransack.configure do |config|
      { array_contained_within:           :contained_within,
        array_contained_within_or_equals: :contained_within_or_equals,
        array_contains:                   :contains,
        array_contains_or_equals:         :contains_or_equals,
        array_overlap:                    :overlap
      }.each do |rp, ap|
        config.add_predicate rp, arel_predicate: ap, wants_array: true
      end
    end
    

    如果出现以下情况,您可以确认 Ransack 正在使用添加的方法:

    User.search(roles_contains: [3,4]).result.to_sql
    

    生成此 SQL:

    SELECT "users".* FROM "users"  WHERE ("users"."roles" @> '{"3","4"}')
    

    现在让这些新方法与 Active Admin 一起使用。

    ActiveAdmin.register User do
      filter :roles_array_contains, as: :select, multiple: true, collection: ['foo', 'bar']
    end
    

    当然,请务必将Userroles 更改为适合您情况的模型和属性。

    最后一点。我注意到您在模型中手动设置serialize :attr, Array。要使您的阵列成为 PostgreSQL 阵列,您必须在数据库迁移中指定 array: true。假设您已经这样做了,那么这个serialize 调用是不必要的。实际上,它似乎出于某种原因破坏了这种方法,因此请务必将其删除。

    【讨论】:

    • 我测试了它,但它不起作用。实际上我要调试这个我需要让它工作,即使是在我的多选属性上的“正常,即“非多”选择过滤器”deal_goals。据我说,问题是多选过滤器在属性正常时起作用,但这里它是一个值数组,在这种情况下它似乎不起作用。
    • 问题可能是您使用的是序列化数组。你在使用 PostgreSQL 吗?
    • 是的,正如我提出的问题,我将其序列化以包含许多值(在常量内)。是的,我正在使用 postgresql。你认为这是 postgresql 的问题吗?
    • 我试图在网上查一下,但没有找到有关 postgresql 问题的宝贵资源……您是否已经听说过?你知道任何网站提到如何解决它?
    • 这个解决方案的问题是它修改了字符串列包含(等)谓词以使用数组,这会创建无效的SQL。处理这个问题的方法是为 ransack 创建特定于数组的谓词,然后映射到 arel / Wants_array 谓词。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多