我使用的是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
我得到两条记录。由于两个评论都是由一个用户发布的,我只想要一个用户。
有什么问题?
答案 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的信息应该有效
试试吧〜