Rails破坏子类模型的方法不能按预期工作

时间:2014-06-01 22:58:46

标签: ruby-on-rails activerecord

我正在尝试为游戏构建一个rails网站。我创建了2个模型,表和播放器。为了适应每个表的不同类型的游戏,我决定继承Table和Player模型。例如,我有一个Blackjack类,它扩展了Table模型和扩展Player模型的BlackjackPlayer类。

创建我的桌面和玩家模型:
rails g resource Table type:string data:text
rails g resource Table type:string data:text table_id:integer
我包含了列类型以适应子类。玩家模型有table_id,因为每个表都可以有很多玩家

在创建基表和Player类之后,我为每个创建了一个子类。让我们以二十一点为例。这是模型目录中的blackjack.rb文件:

class Blackjack < Table
  has_many :blackjackPlayers, foreign_key: "table_id"
end

这是我在模型目录中的blackjack_player.rb文件

class BlackjackPlayer < Player
  belongs_to :blackjack, foreign_key: "table_id"
end

我天真地期望子类化就像这样简单,但我错了。这是我不明白的。在rails控制台中,我创建了一些对象:

table = Blackjack.create
table.blackjackPlayers.create
table.blackjackPlayers.create

当我打印table.blackjackPlayers.length时,我正确地得到了2.

但是,当我销毁blackjackPlayer时,行破坏似乎没有正确传播:

table.blackjackPlayers[0].destroy

在销毁之后,当我打印table.blackjackPlayers.length时,我仍然得到2,但我期待的是1。该行已从Player表中正确删除。

为什么会发生这种情况?如何让子类化以其应有的方式工作?我正在使用rails 4

2 个答案:

答案 0 :(得分:3)

如果使用destroy,则使用

table.blackjackPlayers.length

它不会再次查看数据库以进行刷新。

您需要再次查看数据库以获取更新的计数。尝试:

table.reload
table.blackjackPlayers.length

BlackJack.count
BlackjackPlayer.count

看到真实的数字。

答案 1 :(得分:2)

进行了一些测试/挖掘并发现了问题。从数据库中检索对象时,它存在于内存中。从数据库中删除项目时,内存中的对象不会更改,因此长度不会更改。您需要再次从数据库中检索对象才能获得更新的记录。