2

我有以下关系:

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 来做这件事吗?

4

2 回答 2

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 已经取代了它们的位置,所以我决定在没有范围的情况下这样做。

于 2012-04-22T19:43:58.750 回答
0

尝试 :

category.posts.all(:includes => {:comments =>:commenters}, :conditions => ["comments.created_at = ? AND commenters.created_at = ?", 2.weeks.ago, 2.weeks.ago] 
于 2012-04-12T07:31:40.593 回答