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语法要好得多