рельсы: что не так с этим множественным соединением с условиями на ассоциации? - PullRequest
3 голосов
/ 09 марта 2009

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

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}}}

Я получаю сообщение об ошибке: неопределенный метод для all для #Class: 0x4b2a98>. Я предполагаю, что это вводящая в заблуждение ошибка при разборе моих условий. Я следую руководству по Active Record Query. Я не был уверен, использовать ли единственную или множественную форму ассоциаций. Похоже, что с принадлежащим вам, вы должны использовать единственную форму в хеше: 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 на Windows, которая использует 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')  

Соединения отображаются правильно, но не ГДЕ условия. Я пробовал несколько разных вещей, таких как :deck или :decks в условии условия, но не повезло. Может ли это быть еще одним различием между текущими документами интерфейса ActiveRecord Query Interface и тем, как выполняются условия в 2.0.2?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 10 марта 2009

Вам необходимо выполнить ассоциацию с моделью Карты:

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]
1 голос
/ 10 марта 2009

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

Что дает puts DeckCard.respond_to?(:all) результат?

1 голос
/ 10 марта 2009

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

DeckCard.find(:all, :include => [:cards, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}})
1 голос
/ 10 марта 2009

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

:conditions => {:decks => {:game_id => @game.id}, :cards => {:present => true}}
0 голосов
/ 18 июля 2014

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

Синтаксис rails 4 намного лучше

0 голосов
/ 04 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...