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