我正在使用Ransack来允许对我的用户进行高级搜索。目前,用户拥有first_name
,middle_name
和last_name
列。这是我的代码:
.field
= f.attribute_fields do |a|
= a.attribute_select
...
我如何拥有一个名为'Name'的自定义版本,让用户可以搜索上面提到的所有三个列?
注意 我仍然希望将剩余的属性作为选项保留,例如电子邮件,电话号码等。请在确定答案时牢记这一点。
答案 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 %>