Rails在搜索中组合了多个列

时间:2016-04-13 00:22:18

标签: ruby-on-rails ruby search

在我的应用程序中,我有一个包含三列的客户模型,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为&#34; foo&#34 ;,中间名为&#34; bar&#34;和#34; baz&#34;的last_name。搜索&#34; foo&#34;,&#34; bar&#34;或&#34; baz&#34;单独返回结果,但&#34; foo bar&#34;或者&#34; bar baz&#34;才不是。 我可以在所有三列中搜索的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

您可以在数据库查询中连接field,如

<强>更新

.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}%")

答案 1 :(得分:1)

.where(&#34; first_name LIKE?OR middle_name LIKE?或last_name LIKE?或CONCAT(first_name,middle_name,last_name)LIKE?&#34;,&#34;%#{search}%&#34 ;,&#34;%#{search}%&#34;,&#34;%#{search}%&#34;,&#34;%#{search}%&#34;,&#34 ;%#{搜索}%&#34)

答案 2 :(得分:0)

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

sync.WaitGroup