Ruby on Rails:在创建父级时使用默认值构建子级

时间:2010-08-17 03:53:53

标签: ruby-on-rails parent-child

我有父母和孩子的模特关系。在子的migration.rb中,子模型的列都有默认值(parent_id列除外)。

当我创建一个新的父对象时,如何创建一个子对象,并使用默认值和parent_id一起将其保存到表中?

我认为它将与父模型上的after_create类似,但我不确定如何设置它。

2 个答案:

答案 0 :(得分:13)

修订:我修改了使用before_create和构建而不是创建相关模型的答案。一旦父节点被保存,ActiveRecord机器就会负责保存相关的模型。

我甚至测试了这段代码!

# in your Room model...
has_many :doors

before_create :build_main_door

private

def build_main_door
  # Build main door instance. Will use default params. One param (:main) is
  # set explicitly. The foreign key to the owning Room model is set
  doors.build(:main => true)
  true # Always return true in callbacks as the normal 'continue' state
end

####### has_one case:

# in your Room model...
has_one :door
before_create :build_main_door
private
def build_main_door
  # Build main door instance. Will use default params. One param (:main) is
  # set explicitly. The foreign key to the owning Room model is set
  build_door(:main => true)
  true # Always return true in callbacks as the normal 'continue' state
end

...添加

构建方法由拥有模型的机器通过has_many语句添加。由于该示例使用has_many:doors(型号名称Door),因此构建调用是doors.build

请参阅docs for has_manyhas_one以查看添加的所有其他方法。

# If the owning model has
has_many :user_infos   # note: use plural form

# then use
user_infos.build(...) # note: use plural form

# If the owning model has
has_one :user_info     # note: use singular form

# then use
build_user_info(...) # note: different form of build is added by has_one since
                     # has_one refers to a single object, not to an 
                     # array-like object (eg user_infos) that can be 
                     # augmented with a build method

Rails 2.x为关联引入了自动保存选项。我不认为它适用于上述(我使用默认值)。 Autosave testing results.

答案 1 :(得分:1)

你没有指定(或我覆盖它)你正在使用什么样的关系。如果您使用的是一对一关系,例如“has_one”,则无法创建。在这种情况下,你必须使用这样的东西:

在parent.rb中

has_one :child
before_create  {|parent| parent.build_child(self)}

after_create可能也可以,但没有测试过。

在child.rb中

belongs_to :parent

在我当前的应用程序中设置用户模型时,我正在努力解决这个问题。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html 您可以看到has_one不支持parent.build或parent.create

希望这会有所帮助。我自己是Ruby新手,慢慢开始穿越Ruby丛林。一个不错的旅程,但容易迷失。:)