【问题标题】:Rails 3.1: Why do both variables get updated when I only update oneRails 3.1:为什么我只更新一个变量时两个变量都会更新
【发布时间】:2012-02-28 04:22:32
【问题描述】:

对不起,如果这个标题没有意义,我是 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

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

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

...然后 community_cards 使用相同的卡片进行更新,因此 used_cards 和 community_cards 中的对象相同。什么给了?

非常感谢您的智慧!

【问题讨论】:

  • 也从控制器中放置你的`更新操作`代码。

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


【解决方案1】:

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

这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2019-08-19
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多