以下是我的模特:
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中的条件完成之间的另一个区别吗?
谢谢!
答案 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语法要好得多