2

私は次の関係を持っています:

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

次の熱心な負荷があり、投稿、コメント、およびコメントを提供しています (3 つすべてが必要であるため、結合ではなくインクルードが必要であることに注意してください)。

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

ただし、同じ一連の投稿を返しながら、コメント (および可能であればコメント投稿者) を過去 2 週間以内に作成されたコメントのみに制限したいと考えています。最初は、インクルードの条件を指定できると思っていました:

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 に答える