rails : what's wrong with this multiple join with conditions on the associations?
Solution 1
You need to complete your association with the Card model:
class Card < ActiveRecord::Base
has_many :deck_cards
end
EDIT 2: Try this:
DeckCard.find :all, :joins => [:card, :deck], :conditions => ["decks.game_id = ? and cards.present = ?", @game.id, true]
Solution 2
What version of rails? ActiveRecord#all was added sometime after 2.0.2.
What does a puts DeckCard.respond_to?(:all)
result in?
Solution 3
Your :conditions
contains 2 hashes. This is incorrect. You should have two keys (:decks
and :cards
) which should each have a hash as a value. Correct yours to look like this:
:conditions => {:decks => {:game_id => @game.id}, :cards => {:present => true}}
Solution 4
I didn't test this, but what happens if you use...
DeckCard.find(:all, :include => [:cards, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}})
user26270
Updated on June 04, 2022Comments
-
user26270 almost 2 years
Here are my models:
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
Here's my attempted find:
DeckCard.all :joins => [:card, :deck], :conditions => {{:decks => {:game_id => @game.id}}, {:cards => {:present => true}}}
I keep getting the error : undefined method for
all
for #Class:0x4b2a98>. I'm assuming this is a misleading error from parsing my conditions. I'm following the guide for Active Record Query. I wasn't sure about whether to use the singular or plural form of the associations. Look like with a belongs_to, you're supposed to use singular form in the :joins hash, but I wasn't sure in the :conditions hash, so I tried both and neither worked.In case it isn't clear, what I'm trying to do in SQL is:
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
I'm able to get around it for now by using
DeckCard.find_by_sql
, but it would be nice to figure out why the joins and conditions on associations isn't working.I'm using InstantRails-2.0 on windows, which is using Rails 2.0.2
Edited : some progress using
DeckCard.find(:all ...)
instead. I also edited the brackets based on another answer. My latest code isDeckCard.find :all, :joins => [:card, :deck], :conditions => {:deck => {:game_id => @game.id}, :cards => {:present => true}}
which is producing the following 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')
The joins appear correct but not the WHERE conditions. I've tried a few different things like
:deck
or:decks
in the conditions clause but no luck. Could this be another difference between the current ActiveRecord Query Interface docs and how conditions are done in 2.0.2?Thanks!
-
Pesto about 15 years#all is an alias for #find :all. There's no difference.
-
Sarah Mei about 15 yearsHmm, I was misled by the error too! I hadn't seen #all in use before. Thanks.
-
user26270 about 15 yearsI tried this, in addition to Pesto's suggestion, and it still didn't work
-
user26270 about 15 yearsI tried this, both with and without Sarah's suggestion about the Card model, and it still doesn't work
-
user26270 about 15 yearsSorry, I forgot to mention that I'm using InstantRails-2.0, which has Rails 2.0.2; I haven't updated it to the latest Rails (2.3?); DeckCard.respond_to?(:all) returns false; I guess the compiler was right, with the "undefined method for 'all'"! so what should I be using in 2.0.2? or upgrade?
-
wombleton about 15 yearsFor 2.0.2 use find(:all, ...blahblah...) as @danengle mentioned, I believe. If you can flip to 2.2.2, I'd do that though.
-
user26270 about 15 yearsthis is getting closer; the .find(:all...) is the right method for 2.0.2; I can now see the SQL generated; the JOINs are right, the WHERE clause conditions are not; I'm running out of space, have to show error in another comment or in edited post above