Schienen : was ist falsch mit dieser mehrere join-Bedingungen auf die Vereine?
Hier sind meine Modelle:
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 mein versuchter finden:
DeckCard.all :joins => [:card, :deck], :conditions => {{:decks => {:game_id => @game.id}}, {:cards => {:present => true}}}
Ich erhalte die Fehlermeldung : Undefinierte Methode für all
für #Klasse:0x4b2a98>. Ich gehe davon aus das ist ein irreführender Fehler analysiert meine Bedingungen. Ich bin nach der Anleitung für Active-Record-Abfrage. Ich war mir nicht sicher, ob Sie die singular-oder Pluralform des Vereins. Aussehen mit einer belongs_to, Sie soll die Verwendung der singular-form, in der :joins hash, aber ich war nicht sicher, in der :Bedingungen-hash, also versuchte ich, beides und weder gearbeitet.
Im Fall es ist nicht klar, was ich versuche zu tun, in SQL 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 zu bekommen, um es jetzt durch die Verwendung DeckCard.find_by_sql
, aber es wäre schön, herauszufinden, warum die Verknüpfungen und Bedingungen auf Verbände nicht funktioniert.
Ich bin mit InstantRails-2.0 auf windows, die mit Rails 2.0.2
Bearbeitet : einige Fortschritte mit DeckCard.find(:all ...)
statt. Ich bearbeitete auch die Klammern auf der Basis einer anderen Antwort. Meine Letzte code ist
DeckCard.find :all, :joins => [:card, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}}
welche produziert den folgenden Fehler:
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')
Die Verknüpfungen korrekt angezeigt, aber nicht die, WO die Bedingungen. Ich habe versucht ein paar verschiedene Dinge wie :deck
oder :decks
in den AGB-Klausel, aber kein Glück. Ein weiterer Unterschied zwischen dem aktuellen ActiveRecord-Abfrage-Schnittstelle docs und wie die Bedingungen sind in 2.0.2?
Dank!
Siehe meine aktualisierte Antwort für einen anderen Vorschlag.
InformationsquelleAutor user26270 | 2009-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie benötigen, um Ihre Vereinigung mit dem Card Modell:
EDIT 2: Versuchen Sie dies:
Hmm, ich war irregeführt durch den Fehler auch! Ich hatte nicht gesehen, dass #alle vor. Danke.
Ich habe versucht, zusätzlich zu Pesto ' s Vorschlag, und es funktioniert immer noch nicht
EDIT 2 funktioniert! Danke!
InformationsquelleAutor Sarah Mei
Ihre
:conditions
enthält 2-hashes. Das ist falsch. Sie müssen zwei Tasten (:decks
und:cards
), die sollten jeweils einen hash-Wert. Richtige Ihnen an wie folgt Aussehen:InformationsquelleAutor Pesto
Habe ich nicht getestet, aber was passiert, wenn Sie...
InformationsquelleAutor danengle
Welche version von rails? ActiveRecord#alle Hinzugefügt wurde irgendwann nach 2.0.2.
Was macht ein
puts DeckCard.respond_to?(:all)
führen?Für die 2.0.2 verwenden find(:all, ...blahblah...), wie @danengle erwähnt, glaube ich. Wenn Sie können auch flip zu 2.2.2, würde ich das tun, obwohl.
InformationsquelleAutor wombleton
Ihre syntax ist auch rückwärts. Ich glaube, die mitmachen (und join-Tabelle) muss alphabetisch geordnet. Daher card_decks. Ich glaube, dies ist der Standard-Konfiguration von rails. Ich hatte ein problem ähnlich wie diese einmal, bevor ich begann mit has_many => :durch
InformationsquelleAutor nacengineer
@game.deck.deckcards.joins(:cards).where('cards.present' => true)
Schienen 4 syntax ist viel besser
InformationsquelleAutor Sam G