Rails 3.1:当我只更新一个时,为什么两个变量都会更新

时间:2012-02-28 04:22:33

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1

很抱歉,如果这个标题没有意义,我是Rails的新手,我正在建立一个扑克游戏来学习框架。我有一个游戏模型......

class Game < ActiveRecord::Base

    has_many :players, :dependent => :destroy
    has_many :community_cards, :class_name => "Card", :dependent => :destroy
    has_many :used_cards, :class_name => "Card", :dependent => :destroy

...有一些关于玩家,社区卡和used_cards的关联。但是,当我将卡片对象添加到used_cards ...

new_card = Card.create(:suit => random_suit, :face => random_face)
used_cards << new_card 

...然后,community_cards会使用相同的卡进行更新,因此used_cards和community_cards都包含相同的对象。是什么给了什么?

非常感谢您的所有智慧!

1 个答案:

答案 0 :(得分:2)

由于Card模型存储单个game_id字段,然后该新卡被设置为游戏对象的子元素,因此两个阵列都会更新。 Rails无法知道什么是什么。但是,有一个解决方案。

如果查看api.rubyonrails.org上的has_many文档,您会看到有一个条件选项。所以我建议你做的是在卡模型中添加一个布尔字段。然后为Card模型的每个has_many声明添加一个条件,以检查布尔值。例如

rails g migration add_used_to_cards used:boolean

然后编辑生成的迁移文件,以便设置默认值。 add_column方法应如下所示:

 add_column :cards, :used, :boolean, :default => false

然后改变你的has_many:

has_many :community_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :used => false }
has_many :used_cards, :class_name => "Card", :dependent => :destroy, :conditions => { :used => true }

这应该可以解决问题。