ActiveRecord关系中的build和create方法有什么区别?

时间:2011-08-11 10:28:59

标签: ruby-on-rails activerecord

我有一个可以拥有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相比如何?什么时候应该使用哪个?

3 个答案:

答案 0 :(得分:17)

buildcreate之间的区别在于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用于新方法。