2012-04-12 7 views
2

Ich habe die folgenden Beziehungen:eine Bedingung auf einem Putting enthält

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

Ich habe folgende eifrig Last, mir Beiträge zu geben, Kommentare und commenters (beachten Sie, dass ich alle 3 benötigen, und damit die beinhaltet im Gegensatz zu

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

, ich würde jedoch Joins) gerne Kommentare begrenzen (und nur auf dem in den letzten zwei Wochen noch erstellt, wenn möglich commenters), während die gleiche Menge der Beiträge zurück. Anfangs dachte ich, ich eine Bedingung angeben, könnte man auf die beinhaltet:

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

aber festgestellt, dass dies gibt nur die Beiträge, die die Bedingung erfüllen. Ich denke, dass ich etwas tun muss, etwa eine Unterabfrage für Kommentare auszuführen und dann einen Join durchzuführen. Gibt es einen einfachen Weg, dies mit AR zu tun, wäre ich besser dran mit sql?

+0

Wenn Ihr Problem "gelöst" ist, akzeptieren Sie bitte die Antwort, die Ihr Problem gelöst hat oder schreiben und akzeptieren Sie eine Antwort, wie Sie das Problem gelöst haben –

Antwort

1

Schließlich gelang dies aus, um herauszufinden, diese Seite zu lesen: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

ich einfach benötigt, um eine Assoziation in meinem Beitrag Modell zu erstellen, wie:

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

Dann könnte ich Folgendes tun, um das gewünschte ActiveRecord :: Association-Objekt zu erhalten:

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

Es gab auch einen Vorschlag, dies zu tun, indem Sie einen Bereich auf einem Modell verwenden. Wie auch immer, ich habe irgendwo gelesen (ich glaube, es war auf SO), dass Bereiche auf dem Weg nach draußen sind und dass ARel ihren Platz eingenommen hat, also habe ich beschlossen, dies ohne Bereiche zu tun.

0

Versuchen:

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

Danke. Es sieht so aus, als müsste ich die Includes von includes (: comments,: comments) in includes (: comments =>: commenter) in meinem Code ändern. Werde es ein bisschen mehr testen und erneut posten, wenn ich irgendwelche Probleme damit habe. – asahi

+0

nach mehr Tests, das tut nicht ganz das, was ich brauche. Wie in der ursprünglichen Frage angegeben, muss ich für Beiträge nicht durch die Bedingung begrenzt werden. – asahi

+0

Ich denke, dass ich etwas brauche, das die Bedingung auf die ON-Klausel innerhalb der SQL-Abfrage setzen wird, obwohl nicht sicher, wie dies zu tun ist. Alternativ denke ich, dass ich zwei Abfragen durchführen kann, eine für die Posts und eine für die Kommentare und Kommentatoren und finde die Kommentare, die zu einem bestimmten Beitrag passen. Jedoch bin ich noch nicht sicher, wie man ein ActiveRecord :: Relation-Objekt durchquert, und ich finde nicht viel Dokumentation, um mir zu helfen. – asahi

Verwandte Themen