当前位置: 代码迷 >> 综合 >> Ruby on Rails,使用new和create创建ActiveRecord对象及他们之间的区别
  详细解决方案

Ruby on Rails,使用new和create创建ActiveRecord对象及他们之间的区别

热度:92   发布时间:2023-12-09 08:36:50.0


欢迎来我的博客http://blog.csdn.net/abbuggy/article/details/7944401

在前文《Ruby on Rails,使用Rails Console进行ActiveRecord调试》中,我们能够在rails console中访问模型并进行对象创建和入库操作。

现在我们来看一看创建和入库操作的一些细节。在rails中,new/save操作和create操作都可以创建ActiveRecord对象并持久化到数据库。他们之间的区别还是比较容易猜测出来的。

没错,new操作负责创建对象并返回,在对对象属性赋值之后,调用save方法,对象被保存到数据库中。

[plain] view plain copy
  1. 1.new方法创建对象通过传入参数设置对象属性  
  2. 2.手动设置对象属性  
  3. 3.save方法将对象保存  

create方法相当于把这三步操作整合到了一起,创建对象的同时根据参数对对象属性赋值,并把它保存到数据库中,返回更新了数据库属性的对象实例。

[plain] view plain copy
  1. 1.创建对象  
  2. 2.通过传入的参数设置对象属性  
  3. 3.将对象保存  

之前创建的Subject只是简单的继承了ActiveRecord,没有任何字段。在前文《Ruby on Rails,数据库迁移命令和迁移任务编写》中介绍过创建迁移任务为模型增加字段很容易。我们增加两个字段name和position,迁移任务创建完成后别忘了执行迁移操作使其生效。

[ruby] view plain copy
  1. E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration add_name_to_subject name:string  
  2.       invoke  active_record  
  3.       create    db/migrate/20120904162306_add_name_to_subject.rb  
  4.   
  5. E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration add_position_to_subject position:string  
  6.       invoke  active_record  
  7.       create    db/migrate/20120904162329_add_position_to_subject.rb  
  8.   
  9. E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate  
  10. ==  AddNameToSubject: migrating ===============================================  
  11. -- add_column(:subjects:name:string)  
  12.    -> 0.4890s  
  13. ==  AddNameToSubject: migrated (0.4960s) ======================================  
  14.   
  15. ==  AddPositionToSubject: migrating ===========================================  
  16. -- add_column(:subjects:position:string)  
  17.    -> 0.1870s  
  18. ==  AddPositionToSubject: migrated (0.1930s) ==================================  

rails会自动探测数据库的结构,所以不需要向Subject中增加name和position的定义。现在的Subject内容如下

[ruby] view plain copy
  1. class Subject < ActiveRecord::Base  
  2. end  

先用new/save的方法保存看看。通过带参数的new方法设置name属性(也可以不传入参数,不对属性进行设置),通过回显可以看出name属性已经被设置。请注意id属性是数据库的主键,现在是nil(空)意味着这个对象是处于游离状态的,通过new_record?方法看一看,果然true。接着可以设置对象的属性,我把position设置为“coder”(命苦啊。。。)。save方法将对象保存,回显显示保存成功。这时候再查看一下new_record?方法,结果false说明对象已经是持久化状态了。这时候,id属性已经被更新为2,因为上一篇中向数据库中保存过一次Subject,所以这次在上一次的基础上自增1。

[ruby] view plain copy
  1. irb(main):007:0> subject=Subject.new(:name=>"abbuggy")  
  2. => #<Subject id: nil, created_at: nil, updated_at: nil, name: "abbuggy", position: nil>  
  3. irb(main):008:0> subject.new_record?  
  4. => true  
  5. irb(main):009:0> subject.position="coder"  
  6. => "coder"  
  7. irb(main):010:0> subject.save  
  8.   [1m[36m (0.0ms)[0m  [1mBEGIN[0m  
  9.   [1m[35mSQL (10.0ms)[0m  INSERT INTO `subjects` (`created_at`, `name`, `position`, `updated_at`) VALUES ('2012-09-04  
  10.  17:07:34', 'abbuggy', 'coder', '2012-09-04 17:07:34')  
  11.   [1m[36m (24.0ms)[0m  [1mCOMMIT[0m  
  12. => true  
  13. irb(main):011:0> subject.new_recorde?  
  14. => false  
  15. irb(main):012:0> subject.id  
  16. => 2  
  17. irb(main):013:0>  

下面使用create方法创建和保存对象。这时候想设置属性得一次成功了,因为create方法结束时对象就已经持久化到数据库里面了。方法的返回值既是持久化对象,id更新为3。

[ruby] view plain copy
  1. irb(main):014:0> subject2=Subject.create(:name=>"terry",:position=>"manager")  
  2.   [1m[35m (0.0ms)[0m  BEGIN  
  3.   [1m[36mSQL (19.0ms)[0m  [1mINSERT INTO `subjects` (`created_at`, `name`, `position`, `updated_at`) VALUES ('2012-0  
  4. 9-04 17:27:31', 'terry', 'manager', '2012-09-04 17:27:31')[0m  
  5.   [1m[35m (23.0ms)[0m  COMMIT  
  6. => #<Subject id: 3, created_at: "2012-09-04 17:27:31", updated_at: "2012-09-04 17:27:31", name: "terry", position: "mana  
  7. ger">  

看来一般还是使用new/save的方式多一些吧,不过create方式对于通过命令向数据库中插入若干记录的场景还是比较方便的。

欢迎来我的博客http://blog.csdn.net/abbuggy/article/details/7944401
  相关解决方案