【问题标题】:Rails combine multiple columns in searchRails 在搜索中组合了多个列
【发布时间】:2016-08-03 20:08:25
【问题描述】:

在我的应用程序中,我有一个包含三列的客户模型,first_namemiddle_namelast_name。我在模型中有一个执行搜索的方法:

class Customer < ActiveRecord::Base
  belongs_to :user

  def self.search(search, user)
    if search
      .where('first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?', "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%")
      .where(user: user)
    else
      where(user: user)
    end
  end

end

这个搜索功能的问题是它一次只允许搜索三列之一。

例如,客户的 first_name 为“foo”,middle_name 为“bar”,last_name 为“baz”。单独搜索“foo”、“bar”或“baz”会返回结果,但“foo bar”或“bar baz”不会。 允许在所有三列中进行搜索的最佳方式是什么?

【问题讨论】:

    标签: ruby-on-rails ruby search


    【解决方案1】:

    您可以在数据库查询中连接您的fields,例如

    更新:

    .where("concat_ws(' ' , first_name, middle_name, last_name) LIKE ?", "%#{search}%")
    

    这应该适用于 foofoo barfoo bar baz 但不是foo baz

    如果你也想支持foo baz,那么

    .where("first_name LIKE ? OR middle_name LIKE ?"\
           " OR last_name LIKE ? OR concat_ws(' ' , first_name, middle_name, last_name) LIKE ?"\
           " OR concat_ws(' ' , first_name, last_name) LIKE ?", 
           "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%")
    

    【讨论】:

    • 我无法让这段代码正常工作。这需要特定的数据库吗?我正在使用 sqlite 进行开发。
    • 道歉;我忘了把单引号改成双引号
    【解决方案2】:

    .where("first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ? or CONCAT(first_name, middle_name, last_name) LIKE ?", "%#{search}%", "%#{search}%", " %#{search}%", "%#{search}%", "%#{search}%")

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 回答问题的额外上下文将显着改善其长期价值。请edit你的答案添加一些解释。
    【解决方案3】:

    如果你使用pg,你可以这样尝试

    def self.search(query)
        where(['phone ilike :query',
           'LOWER(name) ilike :query',
           'LOWER(email) ilike :query',
           'LOWER(address) ilike :query'].join(' OR '), {query: "%#{query}%" })
    end
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 2012-03-11
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2015-09-11
      • 2013-06-17
      相关资源
      最近更新 更多