Active Record使得實現CRUD的數據庫基本操作變得簡單,在下面的幾節裡我們使用Mysql數據庫中的orders表來進行CRUD的操作,這次先看創建(Create)。
我們假想有一個Model,名為Order:
class Order < ActiveRecord::Base end
在面向對象的模型裡,表對應類,表中的行對應類的對象。我們可以通過創建一個類的對象來創建一條記錄。對orders表,我們可以使用Order.New()方法來創建一個Order的對象,也就對應了orders表的一條記錄,然後我們給該對象的每個屬性賦值,最後,我們調用對象的save()方法將數據寫回數據庫,如果不調用save()的話,那麼這個對象僅僅在內存中存在,而不是數據庫。
an_order = Order.new an_order.name = "Dave Thomas" an_order.email = "[email protected]" an_order.address = "123 Main St" an_order.pay_type = "check" an_order.save
Active Record的構造器有一個可選的塊(block),這個塊可以將創建的Order對象做為參數,這樣就不需要再創建一個Order類的對象的變量了:
Order.new do |o| o.name = "Dave Thomas" # . . . o.save end
Active Record也可以接收一組哈希(Hash)參數的值來作為可選參數,由屬性的名字和相對應的值組成:
an_order = Order.new( :name => "Dave Thomas", :email => "[email protected]", :address => " 123 Main St ", :pay_type => "check") an_order.save
注意到現在為止,我們還沒有任何關於id的設置,這是因為我們使用Active Record的默認約定,將orders表的主鍵為一個integer類型的列。在存入數據庫的時候,Active Record自動給新建的對象生成一個唯一的值,並且設置到id屬性上,我們可以在save()之後查詢id的值:
an_order = Order.new an_order.name = "Dave Thomas" # ... an_order.save puts "The ID of this order is #{an_order.id}"
new()構造函數在內存中創建了一個Order類的對象,你需要在某個時候調用save()方法來保存到數據庫。Active Record還有一個約定的方法create(),下面的例子說明這個方法的用法,同時展示了創建對象和存儲到數據庫:
an_order = Order.create( :name => "Dave Thomas", :email => "[email protected]", :address => "123 Main St", :pay_type => "check")
也可以給create()方法傳遞哈希(hash)的數組,在數據庫中創建多條記錄,並且返回對應的對象數組。
orders = Order.create( [ { :name => "Dave Thomas", :email => "[email protected]", :address => "123 Main St", :pay_type => "check" }, { :name => "Andy Hunt", :email => "[email protected]", :address => " 456 Gentle Drive ", :pay_type => "po" } ] )
方法new()和create()的真正目的就是讓我們可以通過一組參數就能夠創建Model對象:
order = Order.create(params)