如何仅查找已发布至少一条评论的用户

Nic*_*ilt 4 activerecord ruby-on-rails

我正在使用Rails 2.3.5.

这是一个标准案例.表是:用户,评论,user_comments.我需要找到状态为"有效"且已发布至少一条评论的所有用户.

我知道评论表可以有外键,但这是一个人为的例子.表中有两个用户.有两条评论.这两条评论都是由第一个用户发布的.

named_scope :with_atleast_one_comment, lambda { {
      :joins => 'inner join user_comments on users.id = user_comments.user_id ' } }


 named_scope :with_active_status, {:conditions => {:status => 'active'} }    
Run Code Online (Sandbox Code Playgroud)

当我执行

 User.with_atleast_one_comment.with_active_status 
Run Code Online (Sandbox Code Playgroud)

我得到两条记录.由于两个评论都是由一个用户发布的,我只想要一个用户.

有什么问题?

EmF*_*mFi 5

with_at_least_one_comment范围的行为与您期望的不同.正如问题中所示,它将为user_comments中的每个条目选择一个用户.这导致您看到的重复结果.当与active_users复合时,您将删除没有活动状态的with_at_least_one_comment返回的任何记录.

让我们首先简化有问题的命名范围.您不需要lambda,因为没有参数可以使用,并且连接可以外包给Active Record,如果给定关联,它将执行内连接.

简而言之,这个命名范围将完全符合您的要求.

named_scope :with_at_least_one_comment, :joins => :user_comments, 
  :group => 'users.id'
Run Code Online (Sandbox Code Playgroud)