Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何仅查找已发布至少一条评论的用户_Ruby On Rails_Activerecord - Fatal编程技术网

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

Ruby on rails 如何仅查找已发布至少一条评论的用户,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我使用的是Rails 2.3.5 这是一个标准案例。表格包括:用户、注释、用户注释。我需要找到所有状态为“活动”且至少发布了一条评论的用户 我知道comments表可以有外键,但这是一个人为的例子。表中有两个用户。有两条评论。这两条评论都是由第一个用户发布的 named_scope :with_atleast_one_comment, lambda { { :joins => 'inner join user_comments on users.id = user_commen

我使用的是Rails 2.3.5

这是一个标准案例。表格包括:用户、注释、用户注释。我需要找到所有状态为“活动”且至少发布了一条评论的用户

我知道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 
我有两张唱片。因为两个评论都是由一个用户发布的,所以我只需要一个用户


修复方法是什么?

指定:uniq=>true选项以从集合中删除重复项。这在与:through选项结合使用时非常有用。

带有至少一个注释范围的注释作用域的行为不符合您的预期。如问题中所示,它将为用户注释中的每个条目选择一个用户。这会导致您看到重复的结果。当与活动用户复合时,您将删除由with_返回的任何记录,其中至少有一条注释没有活动状态

让我们首先简化有问题的命名范围。 您不需要lambda,因为没有参数可以接受,连接可以外包给活动记录,如果给定关联,活动记录将执行内部连接

简而言之,这个命名范围将完全满足您的需要

named_scope :with_at_least_one_comment, :joins => :user_comments, 
  :group => 'users.id'

如果我没有错的话,没有什么办法可以做到这一点。。。
除非用户评论?
或者另一种方法是在控制器中指定新方法 最后…
来自Emfi的信息应该有用
试试看~

ArgumentError:Unknown key(s):uniq如果我命名了_scope:with_至少有一个_注释,lambda{{:uniq=>true,:joins=>'internal join user_comments on users.id=user_comments.user_id}你的建议不错。但是,他们否定了命名_范围的优势。这是将ActiveRecord对象的填充延迟到只选择所需记录的优化。依靠新的控制器方法或除非user.comments,否则需要选择所有填充AR对象的用户并丢弃不需要的对象。这将导致非常大的SQL查询/响应,在大量使用的情况下会大大减慢速度,并可能会中断分页。是的……你是对的~我的错不在乎应用程序的性能,所以……最后的结论来自Emfi的答案是最好的。。。