Tutorial :rails : what's wrong with this multiple join with conditions on the associations?


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 is

DeckCard.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?



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]  


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


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


What version of rails? ActiveRecord#all was added sometime after 2.0.2.

What does a puts DeckCard.respond_to?(:all) result in?


Your syntax is also backwards. I believe the join (and join table) needs to be arranged alphabetically. Hence card_decks. I believe this is the default configuration of rails. I had a problem similar to this once before I started using has_many => :through


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

rails 4 syntax is much better

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »