我有一个可以拥有0或1个个人资料的用户。在我的Controller中,如果给出了一些值,我想保存配置文件,如下所示:
# PUT /users/1
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
if params[:profile][:available] == 1 #available is a checkbox that stores a simple flag in the database.
@user.create_profile(params[:profile])
end
else
#some warnings and errors
end
end
我想知道的部分是create_profile
,神奇的create_somerelationname
。与魔术build_somerelationname
相比如何?什么时候应该使用哪个?
答案 0 :(得分:17)
build
和create
之间的区别在于create还保存了创建的对象,因为build只返回新创建的对象(尚未保存)。
文档稍微隐藏here。
因此,根据您是否对返回的对象感到满意,您需要create
(因为您不再更改它)build
因为您想要在再次保存之前更新它(将为您节省保存操作)
答案 1 :(得分:10)
@user.build_profile
与
Profile.new(:user_id => @user.id)
而@user.create_profile
与
Profile.create(:user_id => @user.id)
@user.create_profile
可以build_profile
显示,如下所示:
profile = @user.build_profile
profile.save
http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one
答案 2 :(得分:7)
来自guide
build_association(attributes = {})
build_association方法返回关联的新对象 类型。此对象将从传递的属性中实例化,并且 通过其外键的链接将被设置,但相关联 对象尚未保存。
create_association(attributes = {})
create_association方法返回关联的新对象 类型。此对象将从传递的属性中实例化,并且 将设置通过其外键的链接。除此之外 相关对象将被保存(假设它通过任何 验证)。
您应该使用什么取决于要求。通常,build_association
用于新方法。