【问题标题】:Filter by serialized attribute using ActiveAdmin使用 ActiveAdmin 按序列化属性过滤
【发布时间】:2014-03-20 22:10:15
【问题描述】:

我正在使用 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"}>

如您所见,abilities 属性User model 上定义为:

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

【问题讨论】:

    标签: ruby-on-rails activeadmin ransack


    【解决方案1】:

    我认为这应该可行

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

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

    UPD

    如果您只需要搜索键,并且您的序列化器使用 YAML,您可以尝试使用类似的东西自定义它

    collection:  [["designer", "designer:"], ["other","other:"]]
    

    它会使用“designer:”和“other:”来用 LIKE 搜索

    【讨论】:

    • 如果你有这个怎么办:#&lt;User id: 1, email: "un@tipo.com", abilities: {"designer"=&gt;"Some comment", "developer"=&gt;"Other comment", "manager"=&gt;"Another comment"}&gt; #&lt;User id: 2, email: "otro@tipo.com", abilities: {"designer"=&gt;"I'm designer and developer too"}&gt; 如果你从下拉列表中选择 developer 选项,你会得到两行而不是一行。因为 contains 也会检查键和值(整个字符串)。
    • @Leantraxxx,你的作用域 by_ability_eq 也在做同样的事情,不是吗?
    • 我的范围不起作用。另一方面,我像你一样“解决”了我的问题,但仍然是一种解决方法。所以 +1 的答案,但这不是我需要的。
    • @Leantraxxx,请附上您在能力栏中拥有的原始数据示例
    • 存储在数据库:--- !ruby/hash:ActionController::Parameters art_director: Soy un director de arte desde hace 5 años animation: Más que nada usando flash ui_ux_designer: Tengo 3 años de expriencia en este campo web_developer: uso Ionic para desarrollar sitios mobile。从 rails 控制台:abilities: {"art_director"=&gt;"Soy un director de arte desde hace 5 años", "animation"=&gt;"Más que nada usando flash", "ui_ux_designer"=&gt;"Tengo 3 años de expriencia en este campo", "web_developer"=&gt;"uso Ionic para desarrollar sitios mobile"} 哈希值可以是任何东西,因为我正在存储用户 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多