我有一个模型用户 has_one Email 和 has_many Friends
如果电子邮件是用户模型中的一个字段,我可以使用以下内容来获取所有电子邮件为 nil 的用户: User.where("email IS NULL")
但是,如果电子邮件位于单独的电子邮件模型中,其中该模型属于具有 user_id 键的用户,我不知道该怎么做。
另外,如果我想查找所有没有朋友的用户,如果 User has_many Friends and Friends belongs_to User 我该怎么做
我有一个模型用户 has_one Email 和 has_many Friends
如果电子邮件是用户模型中的一个字段,我可以使用以下内容来获取所有电子邮件为 nil 的用户: User.where("email IS NULL")
但是,如果电子邮件位于单独的电子邮件模型中,其中该模型属于具有 user_id 键的用户,我不知道该怎么做。
另外,如果我想查找所有没有朋友的用户,如果 User has_many Friends and Friends belongs_to User 我该怎么做
User.joins(:email).where(email: {user_id: nil})
您可以使用计数器缓存来执行此操作,例如:
class Friend < ActiveRecords::Base
belongs_to :user, counter_cache: true
end
您需要在 users 表(用户模型)中有 friends_count 字段才能完成这项工作。之后就可以查询了
User.where(friends_count: 0)
在 SQL 中查找没有朋友的用户的最快方法是 NOT EXISTS 相关子查询,体面的 RDBMS 将其实现为antijoin。随着整体数据大小和子记录与父记录的比率增加,这会在性能方面发挥作用,因为它不需要像外部连接通常那样对父记录进行 DISTINCT 操作
在 activerecord 中,您当前将其实现为:
User.where("Not Exists (Select null From friends Where friends.user_id = users.id)")
您可能已经将friends.user_id 编入索引,但这将是检查它的好时机。
就像电子邮件计数一样,这将受益于计数器缓存——搜索特定数量或范围的朋友数量也可以被索引。