2016-04-13 32 views
1

在我的應用程序中,我有一個客戶模型,有三列,first_name,middle_namelast_name。我要在執行搜索模型的方法:Rails在搜索中結合了多列

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 

與此搜索功能的問題是,它僅允許通過一次三列的一個搜索。

例如,客戶的姓氏爲「foo」,中間名稱爲「bar」,姓名爲「baz」。搜索「foo」,「bar」或「baz」會單獨返回結果,但「foo bar」或「bar baz」不會。 我可以允許在所有三列中搜索的最佳方式是什麼?

回答

2

你可以像

數據庫查詢更新Concat的你field S:

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

這應該適用於foofoo 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}%") 
+0

我無法得到這個代碼的工作。但這也需要一定的數據庫?我使用的SQLite – James

+0

道歉;我忘記更改單引號到雙引號 – illusionist

1

。其中(「first_name LIKE? OR middle_name LIKE? OR last_name LIKE?或CONCAT(first_name,middle_name,last_name)LIKE?「,」%#{search}%「,」%#{search}%「,」%#{search}%「,」%#{search}%「,」 %#{}搜索%「)

+0

儘管此代碼可能回答此問題,但提供 有關_why_和/或_how_的其他上下文,它將回答 問題將顯着提高其長期值 值。 [編輯]你的回答r增加一些解釋。 –

0

如果使用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