0

我有一个模型用户 has_one Email 和 has_many Friends

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

但是,如果电子邮件位于单独的电子邮件模型中,其中该模型属于具有 user_id 键的用户,我不知道该怎么做。

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

4

3 回答 3

2
User.joins(:email).where(email: {user_id: nil})

所有没有朋友的用户

于 2013-09-16T07:34:41.107 回答
1

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

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

于 2013-09-16T07:33:10.583 回答
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 编入索引,但这将是检查它的好时机。

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

于 2013-09-16T08:35:07.893 回答