我正在使用Ransack允许对用户进行高级搜索。当前,用户具有first_name
,middle_name
和last_name
列。这是我的代码:
.field
= f.attribute_fields do |a|
= a.attribute_select
...
我如何拥有一个称为"名称"的自定义一个,可以让用户搜索上面提到的所有三列?
注意我仍然想将其余属性保留为选项,例如电子邮件,电话号码等。请在确定答案时请记住这一点。
我建议为此搜索提供专用列。虽然这可能会创建冗余数据,但它比在现有列上进行一些SQL魔术更容易搜索。
您可以轻松地自动化此字段的设置:
before_save :set_full_name
def set_full_name
self.full_name = [first_name, middle_name, last_name].reject(&:blank?).join(" ")
end
然后,您可以使用普通的Ransack方法来搜索此字段。
使用它来搜索多个字段:
= 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作为搜索参数
另一种方法是搜索模型的每个属性,仅排除您 not 想要搜索的字段。为此,您可以创建一种自定义的助手方法,该方法可以通过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 %>