Ruby on Rails,使用new和create創建ActiveRecord對象及他們之間的區別


在前文《Ruby on Rails,使用Rails Console進行ActiveRecord調試》中,我們能夠在rails console中訪問模型並進行對象創建和入庫操作。

現在我們來看一看創建和入庫操作的一些細節。在rails中,new/save操作和create操作都可以創建ActiveRecord對象並持久化到數據庫。他們之間的區別還是比較容易猜測出來的。

沒錯,new操作負責創建對象並返回,在對對象屬性賦值之后,調用save方法,對象被保存到數據庫中。

new方法創建對象通過傳入參數設置對象屬性
手動設置對象屬性
save方法將對象保存

create方法相當於把這三步操作整合到了一起,創建對象的同時根據參數對對象屬性賦值,並把它保存到數據庫中,返回更新了數據庫屬性的對象實例。

創建對象
通過傳入的參數設置對象屬性
將對象保存

之前創建的Subject只是簡單的繼承了ActiveRecord,沒有任何字段。在前文《Ruby on Rails,數據庫遷移命令和遷移任務編寫》中介紹過創建遷移任務為模型增加字段很容易。我們增加兩個字段name和position,遷移任務創建完成后別忘了執行遷移操作使其生效。

E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration add_name_to_subject name:string
      invoke  active_record
      create    db/migrate/20120904162306_add_name_to_subject.rb

E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration add_position_to_subject position:string
      invoke  active_record
      create    db/migrate/20120904162329_add_position_to_subject.rb

E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate
==  AddNameToSubject: migrating ===============================================
-- add_column(:subjects, :name, :string)
   -> 0.4890s
==  AddNameToSubject: migrated (0.4960s) ======================================

==  AddPositionToSubject: migrating ===========================================
-- add_column(:subjects, :position, :string)
   -> 0.1870s
==  AddPositionToSubject: migrated (0.1930s) ==================================

rails會自動探測數據庫的結構,所以不需要向Subject中增加name和position的定義。現在的Subject內容如下

class Subject < ActiveRecord::Base
end

先用new/save的方法保存看看。通過帶參數的new方法設置name屬性(也可以不傳入參數,不對屬性進行設置),通過回顯可以看出name屬性已經被設置。請注意id屬性是數據庫的主鍵,現在是nil(空)意味着這個對象是處於游離狀態的,通過new_record?方法看一看,果然true。接着可以設置對象的屬性,我把position設置為“coder”(命苦啊。。。)。save方法將對象保存,回顯顯示保存成功。這時候再查看一下new_record?方法,結果false說明對象已經是持久化狀態了。這時候,id屬性已經被更新為2,因為上一篇中向數據庫中保存過一次Subject,所以這次在上一次的基礎上自增1。

irb(main):007:0> subject=Subject.new(:name=>"abbuggy")
=> #<Subject id: nil, created_at: nil, updated_at: nil, name: "abbuggy", position: nil>
irb(main):008:0> subject.new_record?
=> true
irb(main):009:0> subject.position="coder"
=> "coder"
irb(main):010:0> subject.save
  [1m[36m (0.0ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (10.0ms)[0m  INSERT INTO `subjects` (`created_at`, `name`, `position`, `updated_at`) VALUES ('2012-09-04
 17:07:34', 'abbuggy', 'coder', '2012-09-04 17:07:34')
  [1m[36m (24.0ms)[0m  [1mCOMMIT[0m
=> true
irb(main):011:0> subject.new_recorde?
=> false
irb(main):012:0> subject.id
=> 2
irb(main):013:0>

下面使用create方法創建和保存對象。這時候想設置屬性得一次成功了,因為create方法結束時對象就已經持久化到數據庫里面了。方法的返回值既是持久化對象,id更新為3。

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

看來一般還是使用new/save的方式多一些吧,不過create方式對於通過命令向數據庫中插入若干記錄的場景還是比較方便的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM