在Active Admin上过滤多选(Rails 3.2 / postgreSQL / active admin 1.0)

时间:2013-12-13 19:35:44

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

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

当我将它们应用于标准内容时,过滤器实际上可以正常工作,但这里是多选

确实在我的优惠模式中:有一个“Deal_goal”属性,我可以选择很多Deal_goal,例如“获取新用户”或“生成动态更新”

以下是我在我的有效管理表单中输入的方式:

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

要进行多重选择,我会在我的交易模型

上对其进行序列化

应用程序/模型/ 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

有人有线索吗?

1 个答案:

答案 0 :(得分:7)

您可以使用与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调用是不必要的。事实上,由于某种原因,它似乎打破了这种方法,所以一定要删除它。