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)
我得到两条记录.由于两个评论都是由一个用户发布的,我只想要一个用户.
有什么问题?
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)
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |