我正在尝试为游戏构建一个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
答案 0 :(得分:3)
如果使用destroy,则使用
table.blackjackPlayers.length
它不会再次查看数据库以进行刷新。
您需要再次查看数据库以获取更新的计数。尝试:
table.reload
table.blackjackPlayers.length
或
BlackJack.count
BlackjackPlayer.count
看到真实的数字。
答案 1 :(得分:2)
进行了一些测试/挖掘并发现了问题。从数据库中检索对象时,它存在于内存中。从数据库中删除项目时,内存中的对象不会更改,因此长度不会更改。您需要再次从数据库中检索对象才能获得更新的记录。