在单个搜索文本字段中搜索多个关键字(RAILS)

时间:2011-06-13 22:59:15

标签: ruby-on-rails-3 search

我很新,在Rails中搜索数据库。我有一个模型和数据库,在'name'属性下有一个名称列表。我希望能够将搜索关键字输入到单个搜索字段中,并且此输入可以是一个字或两个字或更多,具体取决于用户想要的结果的具体程度。

现在,我正在使用如下所示的丑陋内容,最多可以执行3个搜索字词。有没有办法让'search_length'关键字成为动态? find方法显然是重复的,但我不确定如何自动化它并且在其他地方没有找到任何有用的建议。

def self.search(search)

  if search
    search_length = search.split.length
    find(:all, :conditions => ['name LIKE ? AND name LIKE ? AND name LIKE ?', 
    "%#{search.split[0]}%", "%#{search.split[1]}%", 
    "%#{search.split[search_length1]}%"])
  else
    find(:all)
  end
end

除此之外,到目前为止爱Rails。

非常感谢, 列夫

3 个答案:

答案 0 :(得分:7)

如果您使用其他%符号关闭名称变量,ŁukaszŚliwa的代码效果很好。

上面的完整代码为我工作。很棒的帖子。

def self.search(search)

  if search
    search_length = search.split.length
    find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}%" })
  else
    find(:all)
  end

end

答案 1 :(得分:2)

使用类似的东西:

find(:all, :conditions => [(['name LIKE ?'] * search_length).join(' AND ')] + search.split.map { |name| "%#{name}" })

我看起来很奇怪但是,首先生成search_length次字符串'name LIKE?':

 ['name LIKE ?'] * search_length

然后你有一些带有一些键的数组,所以让我们用“AND”加入所有键:

 ["name LIKE ? ", "name LIKE ? ", "name LIKE ? "].join(' AND ')

最后与另一个数组合并。

答案 2 :(得分:0)

formatted_columns = format_column_names(Sub.column_names)
where(formatted_columns.map {|cn| "#{cn} like ?" }.join("or "), *(["%#{search}%"] * formatted_columns.size))

这会处理所有列以及正确的字段数量