2009-03-09 3 views
3

Hier sind meine Modelle:rails: was ist los mit diesem multiple beitreten mit Bedingungen auf den Verbänden?

class Deck < ActiveRecord::Base 
    belongs_to :game 
    has_many :deck_cards 
end 

class DeckCard < ActiveRecord::Base 
    belongs_to :card 
    belongs_to :deck 
end 

class Card < ActiveRecord::Base 
end 

Hier ist mein Versuch Fund:

DeckCard.all :joins => [:card, :deck], :conditions => {{:decks => {:game_id => @game.id}}, {:cards => {:present => true}}} 

Ich erhalte die Fehlermeldung: nicht definierte Methode für all für #class: 0x4b2a98>. Ich nehme an, dies ist ein irreführender Fehler beim Parsen meiner Bedingungen. Ich folge dem Leitfaden für Active Record Query. Ich war mir nicht sicher, ob ich die Singular- oder Pluralform der Assoziationen verwenden sollte. Sieht aus wie mit einem belongs_to, du solltest singular form im: joins jough verwenden, aber ich war mir nicht sicher in dem: conditions Hash, also habe ich beides versucht und keiner hat funktioniert.

Falls es nicht klar ist, was ich versuche, in SQL zu tun ist:

SELECT * from DeckCards 
INNER JOIN decks on decks.id = deck_cards.deck_id 
INNER JOIN cards on card.id = deck_cards.card_id 
WHERE decks.game_id = 4 
AND cards.present = true 

Ich bin in der Lage jetzt um es zu erhalten, indem DeckCard.find_by_sql verwenden, aber es wäre schön, herauszufinden, warum die Joins und Bedingungen für Assoziationen nicht funktionieren.

Ich bin mit Instant-2.0 auf Fenster, die Rails 2.0.2

Herausgegeben verwendet: einige Fortschritte mit DeckCard.find(:all ...) statt. Ich habe auch die Klammern basierend auf einer anderen Antwort bearbeitet. Mein letzter Code ist

DeckCard.find :all, :joins => [:card, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}} 

, die die folgenden Fehler erzeugt:

Unknown column 'deck_cards.decks' in 'where clause': SELECT `deck_cards`.* FROM `deck_cards` INNER JOIN `cards` ON `cards`.id = `deck_cards`.card_id INNER JOIN `decks` ON `decks`.id = `deck_cards`.deck_id WHERE (`deck_cards`.`decks` = '--- \n- :game_id\n- 5\n' AND `deck_cards`.`cards` = '--- \n- :present\n- true\n') 

Das schließt sich korrekt aber nicht die WHERE-Bedingungen auftreten. Ich habe ein paar verschiedene Dinge wie :deck oder :decks in der Klausel Bedingung versucht, aber kein Glück. Könnte dies ein weiterer Unterschied zwischen den aktuellen ActiveRecord Query Interface-Dokumenten und den Bedingungen in 2.0.2 sein?

Danke!

+0

Dieses noch scheint mir ein Syntaxfehler, da wird es nicht Identifizieren Sie sogar die Klasse DeckCard mit Namen. Kannst du die umgebende Methode für die DeckCard.all Zeile posten? – Pesto

+0

Siehe meine aktualisierte Antwort für einen anderen Vorschlag. –

Antwort

3

Sie benötigen eine Verbindung mit dem Kartenmodell vervollständigen:

class Card < ActiveRecord::Base 
    has_many :deck_cards 
end 

EDIT 2: Versuchen Sie folgendes:

DeckCard.find :all, :joins => [:card, :deck], :conditions => ["decks.game_id = ? and cards.present = ?", @game.id, true] 
+0

#all ist ein Alias ​​für #find: all. Es gibt keinen Unterschied. – Pesto

+0

Hmm, ich wurde auch durch den Fehler in die Irre geführt! Ich hatte noch nie #all im Einsatz gesehen. Vielen Dank. –

+0

Ich habe dies versucht, zusätzlich zu Pestos Vorschlag, und es hat immer noch nicht funktioniert – user26270

1

Ihre :conditions enthält 2 Hashes. Das ist falsch. Sie sollten zwei Schlüssel haben (:decks und :cards), die jeweils einen Hash als Wert haben sollten. Richtige Ihnen wie folgt aussehen:

:conditions => {:decks => {:game_id => @game.id}, :cards => {:present => true}} 
+0

Ich versuchte dies, sowohl mit als auch ohne Sarahs Vorschlag über das Kartenmodell, und es funktioniert immer noch nicht – user26270

1

Ich habe das nicht testen, aber was passiert, wenn Sie verwenden ...

DeckCard.find(:all, :include => [:cards, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}}) 
+0

das wird näher; das .find (: all ...) ist die richtige Methode für 2.0.2; Ich kann jetzt das erzeugte SQL sehen; die JOINs haben Recht, die WHERE-Klausel-Bedingungen nicht; Ich habe keinen Platz mehr, muss einen Fehler in einem anderen Kommentar oder in einem bearbeiteten Beitrag über – user26270

1

Welche Version von Schienen? ActiveRecord # all wurde irgendwann nach 2.0.2 hinzugefügt.

Was ergibt sich aus puts DeckCard.respond_to?(:all)?

+0

anzeigen. Leider habe ich vergessen zu erwähnen, dass ich InstantRails-2.0 verwende, das über Rails 2.0.2 verfügt. Ich habe es nicht auf die neuesten Rails (2.3?) Aktualisiert; DeckCard.respond_to? (: All) gibt false zurück; Ich denke, der Compiler hatte Recht, mit der "undefinierten Methode für 'alle'"! Also was sollte ich in 2.0.2 verwenden? oder upgraden? – user26270

+0

Für 2.0.2 benutze find (: alle, ... blahblah ...) als @danengle erwähnt, glaube ich. Wenn Sie zu 2.2.2 drehen können, würde ich das tun. – wombleton

0

Ihre Syntax ist auch rückwärts. Ich glaube, die Join (und Join Tabelle) muss alphabetisch angeordnet werden. Daher card_decks. Ich glaube, das ist die Standardkonfiguration von Schienen.Ich ähnlich ein Problem hatte einmal, bevor ich mit has_many gestartet =>: durch

0

@game.deck.deckcards.joins(:cards).where('cards.present' => true)

Schienen 4 Syntax ist viel besser