2015-07-10 57 views
0

這很難解釋,所以我將從我得到的東西開始。選擇實例OR關聯匹配模糊文本的實例

用戶has_many受撫養人 用戶和受撫養人有姓名。 我想要一個用戶範圍,它將返回所有名稱爲,或者其依賴名稱匹配某個模糊文本的用戶。

它似乎沒有返回所有的預期結果。這是我目前的範圍:

scope :by_fuzzy_text, lambda { |text| 
    text = "%#{text}%" 
    joins(:dependents).where('name ILIKE ? OR dependents.name ILIKE ?', text, text).uniq 
} 

問題是它返回意外的結果。它似乎只適用於我的數據庫中的前11位用戶,儘管超過了100位。因此,無論範圍匹配得多麼完美,它只會返回數據庫中前11名用戶之一的結果。我沒有這個問題,如果我不使用聯接。

希望這是有道理的。 uniq最終是因爲如果用戶有多個依賴項,則用戶會多次返回,每個依賴項都會返回一次。

實施例:

User1 = "Sam Smith" 
-Dependent1.1 = "Ralph Smith" 
-Dependent1.2 = "Alex Smith" 

User2 = "April Shower" 
-Dependent2.1 = "Zach Shower" 
-Dependen2.2 = "Sally Smith" 

User.by_fuzzy_text('w') => [User2]

(四月昭瓦特呃扎克昭瓦特 ER)

User.by_fuzzy_text('z') => [User2]

Ž ACH淋浴)

User.by_fuzzy_text('x') => [User1]

(ALE X史密斯)

User.by_fuzzy_text('smith') => [User1, User2]

(山姆史密斯拉爾夫史密斯,阿萊克斯史密斯,薩利史密斯

回答

0

我需要做一個左外連接以包含沒有任何家屬的用戶。

joins('LEFT OUTER JOIN dependents ON users.id = dependents.user_id').where('name ILIKE ? OR name ILIKE ?', text, text).uniq`