我如何加入并包含该关联

时间:2010-02-26 01:38:28

标签: ruby-on-rails

如何在命名范围内同时使用includejoin? 帖子是多态的

class Post
  has_many :approved_comments, :class_name => 'Comment' 
end

class Comment
  belongs_to :post
end

Comment.find(:all, :joins => :post, :conditions => 
                     ["post.approved = ? ", true],      :include => :post)

这不起作用,因为joins执行内连接,include执行左连接。 数据库引发错误,因为两个连接不能存在于同一查询中。

2 个答案:

答案 0 :(得分:0)

您是否尝试过简单地省略ActiveRecord调用的:joins部分?在has_many关联的测试用例中,如果您的条件引用包含的表名,:include将使用连接。例如,

Comment.all :include => :post

将总共运行两个查询:一个用于评论,一个用于他们的帖子。 Rails团队表示这是更好的表现。但是,如果Rails检测到您的条件需要加入,

Comment.all :include => :post, :conditions => ['post.approved = ?', true]

将运行一个查询,因为您需要它。

ActiveRecord不是那么聪明吗?

答案 1 :(得分:0)

如果您想通过他们的评论获得所有已批准的帖子,您可以执行以下操作:

Post.find(:all, :include => "comments", :conditions => ['approved = ?', true])

这将为您提供包含所有评论的所有已批准的帖子。 您不应该使用join,因为它会导致数据集过于庞大(每个与之相关的注释都会包含产品列)。