把条件放在包含上

时间:2012-04-12 04:13:46

标签: ruby-on-rails-3 activerecord

我有以下关系:

Category has_many :posts
Post has_many :comments
Post has_many :commenters, :through => :comments

我有以下急切的负载,给我帖子,评论和评论者(注意我需要所有3,因此包括而不是连接)

category.posts.includes(:comments, :commenters)

但是,我想将评论(以及可能的评论者)仅限于过去两周内创建的评论,同时仍然返回同一组帖子。最初我以为我可以在包含上指定一个条件:

category.posts.includes(:comments, :commenters).where("comments.created_at > ?", 2.weeks.ago)

但发现这只返回符合条件的帖子。我认为我可能需要做一些事情,比如在评论上执行子查询然后执行连接。有没有一种简单的方法可以用AR来做到这一点,我最好用sql做这个吗?

2 个答案:

答案 0 :(得分:1)

最后设法通过阅读本页来解决这个问题: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

我只需在Post模型中创建一个关联,如:

Post has_many :recent_comments, :class_name = 'Comment', :conditions => ["created_at > ?", 2.weeks.ago]

然后我可以执行以下操作来获取所需的ActiveRecord :: Association对象:

category.posts.includes(:recent_comments => :commenters)

还有一个建议是通过在模型上使用范围来实现这一点。但是,我读到了某个地方(我认为它是在SO上),范围正在逐渐消失,而且ARel取代了它们,所以我决定在没有范围的情况下这样做。

答案 1 :(得分:0)

尝试:

category.posts.all(:includes => {:comments =>:commenters}, :conditions => ["comments.created_at = ? AND commenters.created_at = ?", 2.weeks.ago, 2.weeks.ago]