在写Rails应用过程中,如果使用脚手架,那么Rails会自动生成各种方法给你,可能你不需要理解,但是真正当你自己coding的时候,发现,new,create,build之间,有时候会很迷惑,结合网上资料,作者做以归纳整理.
clark同学的笔记:
首先说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是一对多的关系,那么我们可以用 @person.order.build()方法来创建于该person对应的orders
老宋同学的笔记
save:rails中的save其实是create_or_update,新建或修改记录!不一定是新建,切记
new :只是在内存中新建一个对象,操作数据库要调用save方法。
create = new + 执行sql。
build:与new基本相同,多用于一对多情况下。还有一个不同请看使用示例
!:new!, create!, build!与new, create, build的区别是带!的方法会执行validate,如果验证失败会抛出导常。
save是实例方法,而create, build, new是模型类的类方法
设: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