2012-11-09 63 views
2

我正在使用Ransack来允许我的用户进行高级搜索。目前,用户有first_name,middle_namelast_name列。这里是我的代码:用Ransack搜索多个字段

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

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

注意 我仍想保留其余属性的选择项,如电子邮件,电话号码等确定答案时,请记住这一点。

回答

3

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

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

before_save :set_full_name 

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

然后你就可以使用正常的搜查方法来搜索这个领域。

+0

是的,这是一个好主意。谢谢@Thilo。 – ardavis

1

另一种方法是搜索模型的每个属性,仅排除不要要搜索的字段。要做到这一点,您可以创建一个自定义帮助程序方法,以构建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 %> 
2

使用该搜索多个领域:

= 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作为搜索参数