2

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

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

我怎样才能有一个名为“名称”的自定义项,让用户搜索上述所有三个列?

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

4

3 回答 3

3

我建议为此搜索提供一个专门的专栏。虽然这可能会创建冗余数据,但搜索比对现有列执行一些 SQL 魔术要容易得多。

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

before_save :set_full_name

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

然后就可以用正常的ransack方法来搜索这个字段了。

于 2012-11-09T15:45:40.093 回答
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%' 

当您填写 aq 作为搜索参数时

于 2015-10-08T20:08:41.137 回答
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 %>
于 2014-08-11T06:19:13.553 回答