Ruby on Rails/ActiveRecord/屬性
ActiveRecord 屬性是根據底層資料庫模式自動確定的。
表中的所有列都可透過 ActiveRecord 模型的方法訪問。例如
考慮以下遷移
# 20090409120944_create_products.rb
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.string :name
t.float :price
t.integer :amount
end
end
#...
end
由於 Rails 為我們建立了一個主鍵並將其命名為 "id",因此我們已經可以在資料庫中搜索它。我們可以透過內建控制檯與資料庫互動
ruby script/console
它為我們提供了一個控制檯,讓我們可以與 Rails 進行通訊。
在我們能夠從資料庫中選擇資料之前,現在該插入一些產品了
>> Product.new(:name => "my book", :price => 14.99, :amount => 4).save
如果一切順利,Rails 將向您顯示=>true在控制檯中... 讓我們新增更多產品
>> Product.new(:name => "my movie", :price => 4.89 :amount => 1).save
>> Product.new(:name => "my cd", :price => 9.98, :amount => 12).save
現在我們在資料庫中有 3 個產品,從 1 到 3 ...
所以讓我們選擇第一個條目
>>Product.find(1)
然後 Rails 會告訴你它為這個 id 找到了什麼(記住:find 只有在存在 Rails 生成的 id 作為主鍵時才有效)
=> #<Product: id=1, name="my book" ..... >
所以我們能夠告訴 Rails 查詢具有特定 id 的條目。但是,當我們在資料庫中有數千個條目時會發生什麼?我們無法記住每個產品的 id,因此 Rails 提供了一個非常巧妙的解決方案
>>Product.find_by_name("my book")
=> #<Product: id=1, name="my book" ..... >
然後 Rails 給出了我們想要的結果。這不僅適用於名稱,也適用於資料庫中的所有列。我們也可以使用.find_by_price或者.find_by_amount
或者您可以根據其 id 搜尋多個產品
>>Product.find(1,3)
=> #<Product: id=1, name="my book" ..... ><Product: id=3, name="my cd" ..... >
您也可以搜尋所有產品
>>Product.all
或者
>>Products.find(:all)
用於表中的第一個或最後一個產品
>>Product.first/last
或者
>>Product.find(:first/:last)
如果您想對資料進行更多控制,可以使用許多內建選項或使用自定義 SQL。讓我們嘗試以降序(3,2,1)查詢資料
>>Product.all(:order => "id DESC")
或者
>>Product.find(:all, :order => "id DESC")
將為您提供所有產品,從最後一個插入的 id 開始 - 在我們的案例中:3
當我們查詢資料庫時,我們得到很多我們並不真正感興趣的資訊,例如 "created_at" 和 "updated_at" 列。我們只想看一下我們的 id 和名稱,所以我們可以使用
>>Product.all(:select => "id, name")
或者
>>Product.find(:all, :select => "id, name")
此方法將只顯示產品的名稱和 id,使其更易讀。
在搜尋資料時,請記住,您可以根據自己的喜好組合所有這些方法。要檢視更多可能性,請檢視 RoR 指南 或 API。
您可以覆蓋 ActiveRecord 模型類中的任何訪問器方法,以新增邏輯。例如
class Product
def name
self[:name] || 'Unknown'
end
end
p = Product.new
p.name
=> "Unknown"
p.name = 'my disk'
p.name
=> "my disk"
您可以透過self[attribute_name](獲取)或self[attribute_name]=(設定)。