【问题标题】:Rails Active Record where child IS NULLRails Active Record,其中子项为 NULL
【发布时间】:2013-09-20 06:25:21
【问题描述】:

我有一个模型用户,他有_one 电子邮件和_很多朋友

如果电子邮件是用户模型中的一个字段,我可以使用以下内容来获取所有电子邮件为 nil 的用户: User.where("email IS NULL")

但是,如果电子邮件位于单独的电子邮件模型中,我不知道该怎么做

另外,如果我想查找所有没有朋友的用户,如果 User has_many Friends and Friends belongs_to User 怎么办

【问题讨论】:

    标签: database ruby-on-rails-3 activerecord


    【解决方案1】:
    User.joins(:email).where(email: {user_id: nil})
    

    All users with no friends

    【讨论】:

      【解决方案2】:

      您可以使用计数器缓存来执行此操作,例如:

      class Friend < ActiveRecords::Base
        belongs_to :user, counter_cache: true
      end
      

      您需要在 users 表(用户模型)中有 friends_count 字段才能使这项工作。之后就可以查询了

      User.where(friends_count: 0)
      

      http://guides.rubyonrails.org/association_basics.html

      【讨论】:

        【解决方案3】:

        在 SQL 中查找没有朋友的用户的最快方法是 NOT EXISTS 相关子查询,体面的 RDBMS 将其实现为 antijoin。随着整体数据大小和子记录与父记录的比率增加,这会在性能方面发挥作用,因为它不需要像外部连接通常那样对父记录进行 DISTINCT 操作

        在 activerecord 中,您当前将其实现为:

        User.where("Not Exists (Select null From friends Where friends.user_id = users.id)")
        

        您可能已经将 friends.user_id 编入索引,但现在是检查的好时机。

        与电子邮件计数一样,这将受益于计数器缓存——搜索特定数量或范围的朋友数量也可以被索引。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多