【问题标题】:rails : what's wrong with this multiple join with conditions on the associations?rails :这个多重连接与关联条件有什么问题?
【发布时间】:2010-10-12 07:06:48
【问题描述】:

这是我的模型:

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

我不断收到错误消息:all #Class:0x4b2a98 的未定义方法>。我假设这是解析我的条件的误导性错误。我正在遵循 Active Record Query 的指南。我不确定是使用单数形式还是复数形式的关联。看起来像 belongs_to 一样,你应该在 :joins 哈希中使用单数形式,但我不确定在 :conditions 哈希中,所以我都尝试了,但都没有成功。

如果不清楚,我想在 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 中的条件如何完成之间的另一个区别吗?

谢谢!

【问题讨论】:

  • 这仍然让我感到语法错误,因为它甚至无法通过名称识别类 DeckCard。您可以发布 DeckCard.all 行的环绕方法吗?
  • 查看我的更新答案以获取其他建议。

标签: ruby-on-rails ruby activerecord join


【解决方案1】:

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

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]

【讨论】:

  • #all 是#find :all 的别名。没有区别。
  • 嗯,我也被错误误导了!我以前没见过#all 在使用中。谢谢。
  • 我试过这个,除了Pesto的建议,还是不行
【解决方案2】:

您的 :conditions 包含 2 个哈希值。这是不正确的。您应该有两个键(:decks:cards),每个键都应该有一个哈希值。更正你的样子:

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

【讨论】:

  • 我试过这个,不管有没有莎拉关于卡片模型的建议,它仍然不起作用
【解决方案3】:

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

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

【讨论】:

  • 这越来越近了; .find(:all...) 是 2.0.2 的正确方法;我现在可以看到生成的 SQL; JOIN 是正确的,WHERE 子句条件不是;我的空间用完了,必须在另一条评论或上面的编辑帖子中显示错误
【解决方案4】:

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

puts DeckCard.respond_to?(:all) 会产生什么结果?

【讨论】:

  • 对不起,我忘了说我使用的是 InstantRails-2.0,它有 Rails 2.0.2;我还没有将它更新到最新的 Rails(2.3?); DeckCard.respond_to?(:all) 返回 false;我猜编译器是对的,使用“'all'的未定义方法”!那么我应该在 2.0.2 中使用什么?还是升级?
  • 对于 2.0.2 使用 find(:all, ...blahblah...) 正如@danengle 提到的,我相信。如果您可以切换到 2.2.2,我会这样做。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    @game.deck.deckcards.joins(:cards).where('cards.present' =&gt; true)

    rails 4 语法更好

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      相关资源
      最近更新 更多