【发布时间】:2012-05-21 05:55:42
【问题描述】:
我正在使用 Rails 3.2.2 和 MySQL。我正在按用户名(例如,John、Anthony、Mark)搜索数据库表列:
# User controller
User.search_by_name(params[:search]).order(:name)
# User model
def self.search_by_name(search)
if search
where('users.name LIKE ?', "%#{search}%")
else
scoped
end
end
但是,由于名称可以由两个或多个字符串组成(例如,John Henry 或 Henry John、Anthony Maria 或 Maria Anthony、Mark Alfred 或 Alfred Mark),我会喜欢在params[:search] 提供多个名称时也搜索用户。我尝试使用
def self.search_by_name(search)
if search
search.split(' ').each do |string|
where('users.name LIKE ?', "%#{string}%")
end
else
scoped
end
end
但我收到以下错误(例如,假设我正在搜索 John Henry):
NoMethodError (undefined method `order' for ["John", "Henry"]:Array).
如何正确搜索多个名称?
【问题讨论】:
-
如果您在数据库中有“John Henry”并且有人搜索“John”,它应该匹配吗?如果名字是“Mark Anthony”并且有人搜索“Maria Anthony”怎么办?
-
@mu 太短 - a) 如果你的数据库中有“John Henry”并且有人搜索“John”,它应该匹配吗? i> 是的,应该。 b) 如果名字是“Mark Anthony”并且有人搜索“Maria Anthony”怎么办?在这种情况下它应该返回匹配“Maria”的记录或 “Anthony”(因此,在您的示例中,它应该包括“Mark Anthony”)但记录应该ordered考虑到匹配的“level”(也就是说,记录应该按照那些将“更好”与“Maria Anthony”匹配——我不知道是否可以直接使用 MySQL 查询)。
-
看看stackoverflow.com/a/10551561/1322562。示例中的最后一个功能 --
like_any必须是您的情况。您可以使用类似:names=params[:search].split; @users=User.where{name.like_any(names)}.
标签: mysql sql ruby-on-rails ruby ruby-on-rails-3