2015-07-28 25 views
0

在我的Rails項目我有一個表,看起來像這樣:搜索用戶首先,中間名和姓

create_table "people", force: :cascade do |t| 
    t.string "first_name", limit: 255 
    t.string "last_name", limit: 255 
    t.string "middle_name", limit: 255 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    end 

,我必須通過FIRST_NAME或姓氏搜索查詢:

Person.where("lower(people.first_name) LIKE lower(:q) OR lower(people.last_name) LIKE lower(:q)", q: 'Melanie') 

問題是:有沒有什麼方法可以重構這個查詢來按first_name,last_name和middle_name進行搜索?我的數據庫是Postgresql。

編輯:

當我有與人FIRST_NAME:比爾和last_name:蓋茨,併爲q我設置「比爾·蓋茨」,它會搜索不到正確的記錄。我想獲取該記錄。

回答

0

這按預期工作:

where("lower((COALESCE(people.first_name, '') || COALESCE(people.middle_name, '') || COALESCE(people.last_name, ''))) like lower(?)", "%#{text.split.join('%')}%") 
0

你正在做的正確。剛和另一OR子句middle_name

Person.where("lower(people.first_name) LIKE lower(:q) OR lower(people.last_name) LIKE lower(:q) OR lower(people.middle_name) LIKE lower(:q)", q: 'Melanie') 
+0

當我有人稱與FIRST_NAME:比爾和last_name:蓋茨,併爲q我設置「比爾·蓋茨」,它會不搜索正確的記錄。 –

+0

啊!讓我更新你的問題。你可以跟@Mateusz的回答 – RAJ