使用Ransack搜索多个字段

时间:2012-11-09 13:32:27

标签: ruby-on-rails ransack

我正在使用Ransack来允许对我的用户进行高级搜索。目前,用户拥有first_namemiddle_namelast_name列。这是我的代码:

.field
  = f.attribute_fields do |a|
    = a.attribute_select
    ...

我如何拥有一个名为'Name'的自定义版本,让用户可以搜索上面提到的所有三个列?

注意 我仍然希望将剩余的属性作为选项保留,例如电子邮件,电话号码等。请在确定答案时牢记这一点。

3 个答案:

答案 0 :(得分:3)

我建议为此搜索提供专用列。虽然这可能会创建冗余数据,但在现有列上执行某些SQL魔术时,方式更容易搜索。

您可以轻松自动设置此字段:

before_save :set_full_name

def set_full_name
  self.full_name = [first_name, middle_name, last_name].reject(&:blank?).join(" ")
end

然后您可以使用普通的搜索方法来搜索此字段。

答案 1 :(得分:3)

使用它来搜索多个字段:

= f.text_field(: first_name_or_middle_name_or_last_name_cont)

这将生成如下查询:

where first_name like '%q%' or middle_name like '%q%' or last_name like'%q%' 

当您填写q作为搜索参数

答案 2 :(得分:1)

另一种方法是搜索模型的每个属性,仅排除想要搜索的字段。为此,您可以创建一个自定义帮助器方法,用于构建Ransack搜索方法所期望的标签和搜索字段名称。以下方法(位于帮助程序中)返回您希望以Ransack期望的方式搜索的所有属性的串联:

def most_attributes_cont
  most_attributes = []
  attributes_to_exclude = [
    "id",
    "created_at",
    "updated_at"
  ]
  ModelName.column_names.each do |column_name|
    most_attributes << column_name unless column_name.in?(attributes_to_exclude)
  end
  most_attributes.join("_or_") + "_cont"
end

然后,只需将方法调用添加到搜索表单中:

<%= search_form_for @q do |f| %>
  <%= f.label most_attributes_cont %>
  <%= f.search_field most_attributes_cont %>
  <%= f.submit %>
<% end %>