实例OR关联匹配模糊文本的select实例

时间:2015-07-10 00:23:36

标签: sql ruby-on-rails

这很难解释,所以我将从我所拥有的开始。

用户has_many家属 用户和家属有名字。 我想在User上使用一个范围,该范围将返回名称为OR的所有用户,或者其从属名称与某个模糊文本匹配。

似乎没有返回所有预期的结果。这是我目前的范围:

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]

(April Sho w 呃,Zach Sho w 呃)

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

Z ach Shower)

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

(Ale x 史密斯)

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

(Sam Smith ,Ralph Smith ,Alex Smith ,Sally Smith

1 个答案:

答案 0 :(得分:0)

我需要进行LEFT OUTER JOINS以包含没有任何家属的用户。

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