2012-04-12 29 views
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?

+0

如果您的問題「已解決」,請接受解決您的問題的答案,或者寫下並接受答案,說明您如何解決問題 – 2012-04-22 17:42:29

回答

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) 

也有人建議在模型上使用範圍。然而,我讀過某處(我認爲它就是這樣),範圍正在出路,而且ARel已經佔據了自己的位置,所以我決定在沒有範圍的情況下這樣做。

0

嘗試:

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

謝謝。看起來我只需要在我的代碼中將includes包含(:comments,:commenters)更改爲include(:comments =>:評論者)。如果我遇到任何問題,會再測試一次並再次發佈。 – asahi 2012-04-12 16:39:21

+0

經過更多測試,這並不完全符合我的需求。正如原來的問題所述,我需要帖子不受條件的限制。 – asahi 2012-04-12 19:51:34

+0

我認爲我需要的東西會把條件放在SQL查詢中的ON子句上,但不知道如何去做。或者,我想我可以做2個查詢,一個用於發佈帖子,另一個用於評論和評論者,並查找與給定帖子匹配的評論。但是,我不確定如何遍歷ActiveRecord :: Relation對象,而且我沒有找到很多文檔來幫助我。 – asahi 2012-04-12 21:54:40