Рельсы: что не так с этим множественным соединением с условиями на ассоциации?

Вот мои модели:

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

Здесь моя попытка найти:

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

Я продолжаю получать ошибку: undefined метод для all для #Class: 0x4b2a98 > . Я предполагаю, что это ошибочная ошибка при анализе моих условий. Я следую инструкциям для запроса активной записи. Я не был уверен в том, следует ли использовать единственную или множественную форму ассоциаций. Похоже, что с помощью sort_to вы должны использовать единственную форму в хэше: joins, но я не был уверен в хэш-хэш: поэтому я попробовал оба и ни один не работал.

Если не ясно, что я пытаюсь сделать в SQL:

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

Теперь я могу обойти это, используя DeckCard.find_by_sql, но было бы неплохо выяснить, почему соединения и условия для ассоциаций не работают.

Я использую InstantRails-2.0 для окон, использующих Rails 2.0.2

Отредактировано: некоторый прогресс с использованием DeckCard.find(:all ...). Я также отредактировал скобки, основанные на другом ответе. Мой последний код

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

который вызывает следующую ошибку:

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')  

Соединения отображаются корректно, но не условия WHERE. Я пробовал несколько разных вещей, таких как :deck или :decks в условии условий, но не повезло. Может ли это быть другой разницей между текущими документами API запросов ActiveRecord и тем, как условия выполняются в версии 2.0.2?

Спасибо!

Ответ 1

Вам необходимо заполнить вашу связь с моделью карты:

class Card < ActiveRecord::Base
  has_many :deck_cards
end

РЕДАКТИРОВАТЬ 2: попробуйте следующее:

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

Ответ 2

В вашем :conditions содержится 2 хэша. Это неверно. У вас должно быть два ключа (:decks и :cards), каждый из которых должен иметь хэш в качестве значения. Исправьте свое, чтобы выглядеть так:

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

Ответ 3

Я не тестировал это, но что произойдет, если вы используете...

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

Ответ 4

Какая версия рельсов? ActiveRecord # все было добавлено через некоторое время после 2.0.2.

Что означает puts DeckCard.respond_to?(:all)?

Ответ 5

Ваш синтаксис также обратный. Я считаю, что соединение (и таблица join) должно быть организовано в алфавитном порядке. Следовательно, card_decks. Я считаю, что это стандартная конфигурация рельсов. У меня была проблема, подобная этому, прежде чем я начал использовать has_many = > : через

Ответ 6

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

Синтаксис

rails 4 намного лучше