Rails Active Record其中child为NULL

时间:2013-09-16 07:16:37

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

我有一个模型用户,其中包含电子邮件和has_many朋友

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

但是,如果电子邮件位于单独的电子邮件模型中,我不知道如何执行此操作,此模型属于具有user_id密钥的用户。

此外,如果我想查找没有朋友的所有用户,如果用户has_many朋友和朋友所属的用户

,我该怎么办?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

All users with no friends

答案 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编入索引,但这是检查它的好时机。

与电子邮件计数一样,这可以从计数器缓存中受益 - 搜索特定数字或数量范围的朋友也可以被编入索引。