Rails 之 new build create
做项目的时候,对于数据库的操作方法的胡乱调用时很可怕的,因为自己很初级,初级的不能再初级,所以初次接触rails的时候,对于里面的 create,new,build等方法不是很了解,所以胡乱用了一通,导致了很多的bug,相信很多对rails接触不久的朋友也会有相同的疑惑,今天我来给大家简单的说明一下。
首先说new吧,app = App.new(params[:app]),这个是用给定的params来实例化一个app对象,注意此时只是初始化了一个对象,ruby只是在内存里面给app分配了一个内存地址,但是,这个地址还没有指定任何的有效的内存,所以接下来ruby要做的就是调用model里面的initialize函数来根据给定的参数进行初始化这个对象,并将该对象保存到堆里面。
对于new!来说,这个跟new相比,就是在save到数据库的时候,如果save失败,就会报一个错误。
对于create来说,过程大致跟new差不多,唯一的区别是,create = new + save,即create一步操作等于new和save的两部操作。
对于create!来说,类似于new! 过程大致也是跟new!差不多 区别是create! = new! + save 如果保存失败的话会返回一个错误。
对于build来说,主要的混淆的地方在于与new的区别,其实,我认为build是new的一个别名,但是用的地方可能跟new有点区别,在我看来,build大多是用于有关联关系的对象模型的时候,用来创建子model用的,比如说 Person 与 Order是一对多的关系,那么我们可以用 @persion.build()方法来创建于该person对应的orders
向数据库插记录时经常会用到new, build, create。这三个方法很容易混淆,整理一下备忘:
概述:
new :只是在内存中新建一个对象,操作数据库要调用save方法。
create = new + save。
build:与new基本相同,多用于一对多情况下。还有一个不同请看使用示例
!:new!, create!, build!与new, create, build的区别是带!的方法会执行validate,如果验证失败会抛出导常。
使用示例
设:Article与Comment是一对多关系
@article
= Article.
new
(params[
:article
])
@article
.save
new后要调用save才会操作数据库
注Article.build(params[:article])会报错,build不能这样用。
@article
= Article.create(params[
:article
])
会直接在数据库里插入一条记录
@comment
=
@article
.comments.build
与new方法基本一样,有人说build会自动设置外键值,其实我测试时发现build和new都可以设置外键。
如果你处理一个“has_one”一对一关系时,这样写:
@profile
=
@user
.build_profile