我有以下关系:
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做这个吗?
答案 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]