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

时间:2010-01-18 19:41:36

标签: ruby-on-rails activerecord

我使用的是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'} }    

执行时

 User.with_atleast_one_comment.with_active_status 

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

有什么问题?

3 个答案:

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

答案 1 :(得分:0)

指定:uniq =>用于从集合中删除重复项的true选项。这与:through选项一起使用最为有效。

答案 2 :(得分:0)

如果我没有错,实现这一目标的方法很少......
除非User.comments?
或者另一种方法是在控制器中指定一个新方法 最后......
来自Emfi的信息应该有效 试试吧〜