我有一个模型用户,其中包含电子邮件和has_many朋友
如果电子邮件是用户模型中的字段,我可以使用以下内容来获取电子邮件为nil的所有用户: User.where(“email IS NULL”)
但是,如果电子邮件位于单独的电子邮件模型中,我不知道如何执行此操作,此模型属于具有user_id密钥的用户。
此外,如果我想查找没有朋友的所有用户,如果用户has_many朋友和朋友所属的用户
,我该怎么办?答案 0 :(得分:1)
您可以使用计数器缓存来执行此操作,例如:
class Friend < ActiveRecords::Base
belongs_to :user, counter_cache: true
end
您需要在users表(用户模型)中设置friends_count字段才能使其正常工作。之后,您可以查询
User.where(friends_count: 0)
答案 1 :(得分:1)
User.joins(:email).where(email: {user_id: nil})
答案 2 :(得分: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编入索引,但这是检查它的好时机。
与电子邮件计数一样,这可以从计数器缓存中受益 - 搜索特定数字或数量范围的朋友也可以被编入索引。