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

这是我的模特:

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>。 我假设这是解析我的条件时的一个误导性错误。 我正在关注Active Record Query指南。 我不确定是否使用单数或复数forms的关联。 看起来像使用belongs_to,你应该在:join连接哈希中使用单数forms,但我不确定:条件哈希,所以我尝试了两者并且都没有工作。

如果不清楚,我在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条款条款中的:decks ,但没有运气。 这可能是当前ActiveRecord查询接口文档与2.0.2中条件如何完成之间的另一个区别吗?

谢谢!

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

 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] 

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

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

我没有测试过,但是如果你使用的话会发生什么……

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

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

puts DeckCard.respond_to?(:all)导致什么?

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

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

rails 4语法要好得多