如何为include生成的JOIN添加附加条件?

时间:2010-03-20 05:59:35

标签: ruby-on-rails activerecord

我想为LEFT OUTER JOIN finder中的:include选项生成的ActiveRecord添加其他条件。

class Post
  has_many :comments
end

class Comment
  belongs_to :post
  has_many   :comment_votes
end

class CommentVote
  belongs_to :comment
end

现在让我们说我想找到最近10篇帖子及其相关评论和最多投票。

Post.find.all(:limit => 10, :order => "created_at DESC",
    :include => [{:comments => :comment_votes])

我无法添加条件来检查投票,因为它会忽略没有投票的帖子。因此条件必须转到为comment_votes生成的JOIN的ON子句。我希望语法如下:

Post.find.all(:limit => 10, :order => "created_at DESC",
    :include => [{:comments => [:comment_votes, :on => "comment_votes.vote > 0"])

你以前遇到过这样的问题吗?您是否设法使用当前的查找程序解决了问题?我希望从社区中听到一些有趣的想法。

PS:我可以编写一个连接SQL来获得预期的结果并将结果拼接在一起。我想确保在沿着这条道路前没有其他选择。

1 个答案:

答案 0 :(得分:3)

如果我正确地关注了你的问题,这样的事情可能有效:

class Comment
  belongs_to :post
  has_many   :comment_votes
  has_many   :up_votes, :class_name => "CommentVote", :conditions => "vote > 0"
end

然后你的发现者将是:

Post.find.all(:limit => 10, :order => "created_at DESC",
:include => {:comments => :up_votes})

注意:我没有测试过这个。