proyectos ejemplos ruby-on-rails ruby activerecord join

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