假设我们有一个父模型
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
已被保留
答案 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
,因此只会在保存时填充。