ruby-on-rails - ejemplos - django
rails: ¿qué pasa con esta combinación múltiple con las condiciones de las asociaciones? (6)
Aquí están mis modelos:
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
Aquí está mi intento de encontrar:
DeckCard.all :joins => [:card, :deck], :conditions => {{:decks => {:game_id => @game.id}}, {:cards => {:present => true}}}
Sigo recibiendo el error: método no definido para all
para #Class: 0x4b2a98>. Asumo que este es un error engañoso al analizar mis condiciones. Estoy siguiendo la guía de Active Record Query. No estaba seguro acerca de si usar la forma singular o plural de las asociaciones. Parece que con un belongs_to, se supone que debes usar la forma singular en el hash de join: pero no estaba seguro en el hash de condiciones, así que probé ambos y ninguno funcionó.
En caso de que no esté claro, lo que estoy tratando de hacer en SQL es:
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
Puedo sortearlo por el momento usando DeckCard.find_by_sql
, pero sería bueno averiguar por qué las uniones y las condiciones de las asociaciones no funcionan.
Estoy usando InstantRails-2.0 en Windows, que usa Rails 2.0.2
Editado: algún progreso usando DeckCard.find(:all ...)
lugar. También edité los corchetes basados en otra respuesta. Mi último código es
DeckCard.find :all, :joins => [:card, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}}
que está produciendo el siguiente error:
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'')
Las uniones aparecen correctas pero no en las condiciones DONDE. He intentado algunas cosas diferentes como :deck
o :decks
en la cláusula de condiciones pero sin suerte. ¿Podría ser esta otra diferencia entre los documentos actuales de ActiveRecord Query Interface y cómo se realizan las condiciones en 2.0.2?
¡Gracias!
No probé esto, pero ¿qué pasa si usas ...
DeckCard.find(:all, :include => [:cards, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}})
Su :conditions
contiene 2 hashes. Esto es incorrecto. Debe tener dos claves ( :decks
y :cards
) que cada una debe tener un valor hash. Corrige el tuyo para que se vea así:
:conditions => {:decks => {:game_id => @game.id}, :cards => {:present => true}}
¿Qué versión de rieles? ActiveRecord # all se agregó en algún momento después de 2.0.2.
¿A qué se puts DeckCard.respond_to?(:all)
?
Debe completar su asociación con el modelo de Tarjeta:
class Card < ActiveRecord::Base
has_many :deck_cards
end
EDIT 2 : Prueba esto:
DeckCard.find :all, :joins => [:card, :deck], :conditions => ["decks.game_id = ? and cards.present = ?", @game.id, true]
Tu sintaxis también está al revés. Creo que la unión (y la tabla de unión) debe organizarse alfabéticamente. Por lo tanto, card_decks. Creo que esta es la configuración predeterminada de los rieles. Tuve un problema similar a esto una vez antes de comenzar a usar has_many =>: a través de
@game.deck.deckcards.joins(:cards).where(''cards.present'' => true)
la sintaxis de Rails 4 es mucho mejor