Ruby on rails RubyonRails:创建子对象

Ruby on rails RubyonRails:创建子对象,ruby-on-rails,ruby,foreign-keys,parent-child,Ruby On Rails,Ruby,Foreign Keys,Parent Child,我相信这是一个非常简单的问题,但我只是一个新手,所以 我有一个模型,游戏,有很多:堆。桩,反过来,有许多:卡片。我能够在创建游戏时填充堆和卡,因此我目前的代码如下所示: class Game < ActiveRecord::Base has_many :piles def after_create 1.upto(4) do |num| Pile.new("game_id" => id, "contents" => "c_type_#{num}")

我相信这是一个非常简单的问题,但我只是一个新手,所以

我有一个模型,游戏,
有很多:堆
。桩,反过来,
有许多:卡片
。我能够在创建游戏时填充堆和卡,因此我目前的代码如下所示:

class Game < ActiveRecord::Base
  has_many :piles

  def after_create
    1.upto(4) do |num|
      Pile.new("game_id" => id, "contents" => "c_type_#{num}")
    end
  end
end

class Pile < ActiveRecord::Base
  has_many :cards
  belongs_to :game

  def after_create
    1.upto(10) do |num|
      Card.new("pile_id" => id, "value" => num)
    end
  end
end

class Card < ActiveRecord::Base
  belongs_to :pile
end
类游戏id,“内容”=>c#U类型{num}”)
结束
结束
结束
类桩id,“值”=>num)
结束
结束
结束
类卡片
现在一切都很好,但是当ActiveRecord知道game_id是外键并且应该引用父游戏时,传递
“game_id”=>id
感觉是错误的。但是如果我不使用它,外键最终会被取消设置。有更好的方法吗

(另外,问题可能更简单;假设游戏也有一个:猴子
。如何从游戏模型中创建猴子?

,而不是:

Pile.new("game_id" => id, "contents" => "c_type_#{num}")
尝试:

它会尝试立即保存创建的堆。或者,如果您确实需要不进行保存(如
create
),您可以执行以下操作:

new_pile = piles.build("contents" => "c_type_#{num}")
类似于桩类及其卡片

至于
has_one:monkey
,您可以(在游戏方法中)执行以下操作:


您的
Game
对象的
piles
关联集合将具有活动记录提供的
build
create
方法(假设关联对象通过验证,
create
方法也会保存关联对象)

您应该能够执行以下操作:

def after_create
  1.upto(4) do |num|
    piles.create(:contents => "c_type_#{num}")
  end
end

除了其他人所说的之外,您还应该考虑查看这一点——它涉及Rails 2.3中的继承资源,特别是在视图中。

第2部分将于下周一(2010-01-18)发布

create_monkey("some_attr" => "some_value")
def after_create
  1.upto(4) do |num|
    piles.create(:contents => "c_type_#{num}")
  end
end