如何仅在保存潜在父对象时更新子关联

时间:2016-02-17 08:54:06

标签: ruby-on-rails rails-activerecord

假设我们有一个父模型

class Parent < ActiveRecord::Base
  has_one :child
end

我们已经创建了一个child对象(持久存储在数据库中)。

然后,我们为parent = Parent.new创建潜在的 child对象。潜在意味着此父级可能永远不会保存到数据库中,在这种情况下不应更改任何内容。是否可以设置parent的子项,以便在我们调用child之后更新parent.save(即设置其外键)?

当然这可以通过钩子实现,但我只是想知道是否有一种Rails内置方式来实现这一点。

什么不起作用

parent.child = child会自动保存父级,因此我们可能根本不想保存父级。

parent.build_child(child.attributes)无效,因为child已被保留

1 个答案:

答案 0 :(得分:0)

#app/models/child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
end

#app/controllers/parents_controller.rb #-> this can be any controller
class ParentsController < ApplicationController
  def create
    @child = Child.find params[:id]

    @parent = @child.parent.new parent_params
    @parent.save
  end

  private

  def parent_params
    params.require(:parent).permit(:x, :y, :z)
  end
end

您必须记住ActiveRecord是&#34; ORM&#34;,这意味着它会处理您的内存中的对象,而不管数据库将如何存储它们。

您将无法填充&#34;外键&#34;哪个没有保存。在您的情况下,child在保存parent_id之前不会填充parent个外键;但是,ActiveRecord基本上会预先填充各种属性,具体取决于您调用对象的方式。

以上内容从现有parent开始构建新的child

由于您在foreign_key模型中定义child,因此只会在保存时填充。