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

Activerecord 搜索至少一个单词(活动记录),activerecord,Activerecord,我有一个模型,有两个字段:name和subject 我希望用户可以在搜索框中键入“Maria chubbb”,应用程序应该返回每个记录,其中至少有搜索字符串中的一个单词(或%word%),并且该单词可以位于任何字段中。 如何做到这一点 如果您想使用纯ActiveRecord/SQL执行此操作,您可以这样做: words = params[:query].split(' ') # => ["Maria", "chubbb"] conditions = words.collect {|word

我有一个模型,有两个字段:name和subject 我希望用户可以在搜索框中键入“Maria chubbb”,应用程序应该返回每个记录,其中至少有搜索字符串中的一个单词(或%word%),并且该单词可以位于任何字段中。
如何做到这一点

如果您想使用纯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)
class YourModel < ActiveRecord::Base
  define_index do
    indexes :name
    indexes :subject
  end
end
YourModel.search("Maria chubbb")
稍后,如果您想“正确”地执行此操作,请使用Sphinx等搜索引擎(通过Ruby/Rails通过gem连接)。然后,您可以在模型中定义搜索中要包含的字段,如下所示:

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)
class YourModel < ActiveRecord::Base
  define_index do
    indexes :name
    indexes :subject
  end
end
YourModel.search("Maria chubbb")

这里的优点是,即使在大型数据库中,搜索速度也很快,并且可以对结果进行加权,例如,如果两个词都匹配,而只有一个词匹配。

如果要使用纯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)
class YourModel < ActiveRecord::Base
  define_index do
    indexes :name
    indexes :subject
  end
end
YourModel.search("Maria chubbb")
稍后,如果您想“正确”地执行此操作,请使用Sphinx等搜索引擎(通过Ruby/Rails通过gem连接)。然后,您可以在模型中定义搜索中要包含的字段,如下所示:

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)
class YourModel < ActiveRecord::Base
  define_index do
    indexes :name
    indexes :subject
  end
end
YourModel.search("Maria chubbb")
这里的优点是,即使在大型数据库中,搜索速度也很快,并且可以对结果进行加权,例如,如果两个词都匹配,而只有一个词匹配