【问题标题】:Searching on an Enum Field with Ransack使用 Ransack 搜索枚举字段
【发布时间】:2016-05-16 15:41:10
【问题描述】:

我有一个表,'jobs' 带有一个枚举字段'status'。 status 具有以下枚举集:

enum status: [ :draft, :active, :archived ]

使用 ransack,我如何过滤表中的所有活动记录?

【问题讨论】:

  • 请发布您到目前为止所尝试的内容。

标签: ruby ransack


【解决方案1】:

你可以像这样在模型中声明自己的ransacker:

ransacker :status, formatter: proc {|v| statuses[v]} do |parent|
  parent.table[:status]
end

然后您可以使用默认的 ransack 语法 _eq 来检查相等性,如下所示:

Model.ransack(status_eq: 'active').result

编辑:如果列名没有改变,您可以跳过代码块:

ransacker :status, formatter: proc {|v| statuses[v]}

【讨论】:

  • 谢谢。那行得通,但似乎我还不如只使用参数值并进行常规搜索。这样,代码读起来会更好/更简单。在 ActiveAdmin 中添加过滤器无需创建 ransacker,即使他们使用 Ransack 进行过滤。似乎很奇怪,它在前端没有那么容易工作。
  • @Will Yeap,您可以只使用简单的范围。它应该可以正常工作:)但是当您无法跳过使用ransack时会出现问题。如果没有上面提到的代码,它将始终将参数active 转换为整数.to_i,因此您将始终得到0 而不是正确的值。
【解决方案2】:

这是我在视图中用于枚举和洗劫的东西:

<%= f.select :status_eq, Model.statuses.to_a.map { |w| [w[0].humanize, w[1]] },
                         {:include_blank => true} %>

【讨论】:

  • 那么看来您必须将属性的整数值传递给 q 哈希,因为 ransack 不会为您进行枚举对话。
  • 知道如何将其设为radio_buttons吗?
【解决方案3】:

以下适用于所有情况:draft, 'draft', 0, '0' in model

ransacker :status do |parent|
  parent.table[:status]
end

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 2010-12-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多