【问题标题】:select instance where instance OR associations match fuzzy text选择实例或关联匹配模糊文本的实例
【发布时间】:2015-09-28 14:20:39
【问题描述】:

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

用户 has_many 家属 用户和家属有名字。 我想要一个 User 的范围,它将返回其姓名或家属姓名与某个模糊文本匹配的所有用户。

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

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

问题在于它返回了意外的结果。它似乎只适用于我数据库中的前 11 个用户,尽管有超过 100 个。所以无论范围匹配多么完美,它只会返回数据库中前 11 个用户之一的结果。如果我不使用 Joins,我就没有这个问题。

希望这是有道理的。最后的 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 Shower,Zach Shower)

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

(Zach Shower)

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

(麦酒x史密斯)

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

(Sam Smith、Ralph Smith、Alex Smith、Sally Smith)

【问题讨论】:

    标签: sql ruby-on-rails


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      相关资源
      最近更新 更多