在我的应用程序中,我有一个包含三列的客户模型,first_name
,middle_name
和last_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;才不是。 我可以在所有三列中搜索的最佳方式是什么?
答案 0 :(得分:2)
您可以在数据库查询中连接field
,如
<强>更新强>
.where("concat_ws(' ' , first_name, middle_name, last_name) LIKE ?", "%#{search}%")
这适用于foo
,foo bar
或foo 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