我有一个模型让我们说两个字段:名称和主题 我希望用户可以在搜索框中键入“Maria chubbb”,应用程序应该返回每个记录,其中至少有一个单词来自搜索字符串(或%word%),并且该单词可以位于任何字段中。 怎么实现呢?
答案 0 :(得分:0)
如果你想用普通的ActiveRecord / SQL来做,你可以这样做:
words = params[:query].split(' ')
# => ["Maria", "chubbb"]
conditions = words.collect {|word| "name LIKE ? OR subject LIKE ?"}.join(" OR ")
# => "name LIKE ? OR subject LIKE ? OR name LIKE ? OR subject LIKE ?"
values = words.collect {|word| ["%#{word}%", "%#{word}%"]}.sum
# => ["%Maria%", "%Maria%", "%chubbb%", "%chubbb%"]
YourModel.where([conditions] + values)
稍后,如果您想“正确”执行此操作,请使用搜索引擎,例如Sphinx(通过thinking_sphinx gem通过Ruby / Rails连接)。然后在您的模型中,您可以定义要在搜索中包含的字段,如下所示:
class YourModel < ActiveRecord::Base
define_index do
indexes :name
indexes :subject
end
end
然后你可以像这样搜索:
YourModel.search("Maria chubbb")
这里的优势在于,即使在大型数据库中搜索也很快,并且结果可以加权,例如,如果两者匹配,则只有一个单词匹配。