【问题标题】: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 中)。

    如果您希望查询更加动态(例如,如果您想同时使用:ORAND),您可以使用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 查询字符串

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多