rails:这种关联条件的多重连接有什么问题?

时间:2009-03-09 20:52:47

标签: ruby-on-rails ruby activerecord join

以下是我的模特:

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

我一直收到错误:#Class的all的未定义方法:0x4b2a98&gt;。我假设这是解析我的条件时的误导性错误。我正在关注Active Record Query指南。我不确定是否使用单数或复数形式的关联。看起来像使用belongs_to,你应该在:join连接哈希中使用单数形式,但我不确定:条件哈希,所以我尝试了两种方法都没有用。

如果不清楚,我在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来解决它,但是很好地弄清楚为什么关联的连接和条件不起作用。

我正在Windows上使用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,但没有运气。这可能是当前ActiveRecord查询接口文档与2.0.2中的条件完成之间的另一个区别吗?

谢谢!

6 个答案:

答案 0 :(得分:3)

您需要完成与卡片型号的关联:

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 :(得分:1)

您的:conditions包含2个哈希值。这是不正确的。您应该有两个密钥(:decks:cards),每个密钥都应该有一个哈希作为值。纠正你的看起来像这样:

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

答案 2 :(得分:1)

我没有对此进行测试,但如果您使用...会发生什么?

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

答案 3 :(得分:1)

什么版本的导轨? ActiveRecord#all在2.0.2之后的某个时候添加。

puts DeckCard.respond_to?(:all)的结果是什么?

答案 4 :(得分:0)

您的语法也是倒退的。我认为连接(和连接表)需要按字母顺序排列。因此card_decks。我相信这是rails的默认配置。在我开始使用has_many =&gt;之前,我遇到过与此类似的问题。 :通过

答案 5 :(得分:0)

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

rails 4语法要好得多