【问题标题】:Rails where fields concatenated like search query像搜索查询一样连接字段的Rails
【发布时间】:2015-03-09 16:12:06
【问题描述】:
我正在尝试在我的一个 Active Record 模型上创建搜索方法。
我希望用户能够在数据库中搜索记录。
我知道我可以这样做:Model.where('field like ?', "%#{query}%')
但这不仅仅是一个字段,而是两个字段(名字和姓氏)。但我不想单独搜索它们,我想连接名字和姓氏并搜索连接的字段就像搜索查询一样。
这可以通过类似于连接 SQL 字段的 Active Record 来完成吗?最好的解决方案是什么?
【问题讨论】:
标签:
mysql
ruby-on-rails
activerecord
【解决方案1】:
在你的模型中创建一个类方法,如图所示:
def self.search_by_full_name(query)
where("CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{query}%")
end
但在 Rails 中,在这种情况下更常见的是声明作用域而不是类方法,如下所示:
scope :search_by_full_name ->(query) { where("CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{query}%") }
【解决方案2】:
您可以对不同的字段使用相同的where 方法。例如
Model.where(first_name: "Jonathan", last_name: "Smith")
这将为您提供 first_name AND last_name 匹配的所有 关系(在 Rails 4 中)。
如果您希望查询更加动态(例如,如果您想同时使用:OR、AND),您可以使用find_by_sql this:
Person.find_by_sql("SELECT * FROM people WHERE first_name = ? OR first_name = ? AND last_name = ?", first_name1, first_name2, last_name)
但它可能需要更具体的代码化学来构建这样的 SQL 查询字符串