使用ActiveAdmin按序列化属性过滤

时间:2014-03-20 22:10:16

标签: ruby-on-rails activeadmin ransack

我正在使用ActiveAdmin,我需要构建一个自定义过滤器,一个具有过滤用户索引列表功能的组合框。例如:

<select>
   <option value="designer">Diseñador</option>
   <option value="developer">Desarrollador</option>
   <option value="manager">Jefe de Proyecto</option>
</select>

我有用户......

#<User id: 1, email: "un@tipo.com", abilities: {"designer"=>"Some comment", "developer"=>"Other comment", "manager"=>"Another comment"}>
#<User id: 2, email: "otro@tipo.com", abilities: {"designer"=>"blah blah"}>

如您所见,能力属性用户模型上定义为:

serialize :abilities, Hash

因此,当我在组合框中选择设计器时,我想在列表中看到两个用户。 如果我选择经理,我想看一个用户

我知道ActiveAdmin使用ransack来构建过滤器,但我不知道如何使用它来处理序列化属性。

我尝试将ransacker与以下代码一起使用:

ActiveAdmin

ActiveAdmin.register User do  
  filter :by_ability, as: :string, collection: ['designer', 'other']

模型

class User < ActiveRecord::Base
  scope :by_ability_eq, lambda {|v| User.where(["users.abilities LIKE '%?%'", v]) }
  ransacker :by_ability_eq

但是我收到此错误

undefined method `by_ability_eq' for Ransack::Search<class: User, base: Grouping <combinator: and>>:Ransack::Search

1 个答案:

答案 0 :(得分:1)

我认为这应该有用

ActiveAdmin.register User do  
  filter :abilities_contains, as: :select, collection: ['designer', 'other']
  #....
end

在这种情况下,你不需要模型中的范围

<强> UPD

如果您只需要搜索键,并且您的序列号使用YAML,您可以尝试使用类似

的方式对其进行自定义
collection:  [["designer", "designer:"], ["other","other:"]]

它将使用&#34;设计师:&#34;和&#34;其他:&#34;用LIKE搜索