跳到內容

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]=(設定)。

華夏公益教科書