搜索至少一个单词(活动记录)

时间:2010-11-07 16:20:12

标签: activerecord

我有一个模型让我们说两个字段:名称和主题 我希望用户可以在搜索框中键入“Maria chubbb”,应用程序应该返回每个记录,其中至少有一个单词来自搜索字符串(或%word%),并且该单词可以位于任何字段中。 怎么实现呢?

1 个答案:

答案 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")

这里的优势在于,即使在大型数据库中搜索也很快,并且结果可以加权,例如,如果两者匹配,则只有一个单词匹配。