Ruby on Rails 2.1 - Active Record 模型



Rails Active Record 是 Rails 提供的物件關係對映 (ORM) 層。它緊密遵循標準的 ORM 模型,如下所示:

  • 表對映到類,

  • 行對映到物件,以及

  • 列對映到物件屬性。

Rails Active Record 提供了關係資料庫中的表與操作資料庫記錄的 Ruby 程式程式碼之間的介面和繫結。Ruby 方法名稱會根據資料庫表的欄位名稱自動生成。

每個 Active Record 物件都具有用於資料庫訪問的 CRUD(**C**reate、**R**ead、**U**pdate 和 **D**elete)方法。此策略允許在資料庫表和應用程式物件之間進行簡單的設計和直接對映。

將領域模型轉換為 SQL

將領域模型轉換為 SQL 通常很簡單,只要記住您必須編寫 Rails 友好的 SQL。在實踐中,您必須遵循某些規則,例如:

  • 每個實體(例如 book)在資料庫中都會有一個以其名稱命名的表,但使用複數形式(books)。

  • 每個這樣的實體匹配表都包含一個名為 id 的欄位,該欄位包含插入到表中的每個記錄的唯一整數。

  • 給定實體 x 和實體 y,如果實體 y 屬於實體 x,則表 y 包含一個名為 x_id 的欄位。

  • 任何表中的大部分欄位都儲存該實體簡單屬性的值(任何數字或字串)。

建立 Active Record 檔案

要為我們在上一章中介紹的庫應用程式的實體建立 Active Record 檔案,請從應用程式目錄的頂層發出以下命令。

C:\ruby\library\> ruby script/generate model Book
C:\ruby\library\> ruby script/generate model Subject

您告訴生成器建立名為 Book 和 Subject 的模型來儲存書籍和主題的例項。請注意,您正在將 Book 和 Subject 大寫並使用單數形式。這是您每次建立模型時都應遵循的 Rails 正規化。

當您使用 generate 工具時,Rails 會建立實際的模型檔案,其中包含模型特有的所有方法以及您定義的業務規則,一個用於執行測試驅動開發的單元測試檔案,一個樣本資料檔案(稱為 fixtures)與單元測試一起使用,以及一個 Rails 遷移,使建立資料庫表和列變得容易。

除了建立許多其他檔案和目錄外,這還會建立名為 **book.rb** 和 **subject.rb** 的檔案,其中包含 **app/models** 目錄中的骨架定義。

book.rb 中的內容 -

class Book < ActiveRecord::Base
end

subject.rb 中的內容

class Subject < ActiveRecord::Base
end

建立模型之間的關聯

當您的 Rails 應用程式中有多個模型時,您需要在這些模型之間建立連線。您可以透過關聯來做到這一點。Active Record 支援三種類型的關聯:

  • **一對一** - 當一個專案恰好擁有另一個專案的單個專案時,就會存在一對一關係。例如,一個人恰好有一個生日,或者一條狗恰好有一個主人。

  • **一對多** - 當單個物件可以是許多其他物件的成員時,就會存在一對多關係。例如,一個主題可以有多本書。

  • **多對多** - 當第一個物件與第二個物件的多個物件相關聯,而第二個物件與第一個物件的多個物件相關聯時,就會存在多對多關係。

您透過向模型新增宣告來指示這些關聯 - has_one、has_many、belongs_to 和 has_and_belongs_to_many。

現在您需要告訴 Rails 您希望在庫資料系統中建立哪些關係。為此,請修改 book.rb 和 subject.rb 以如下所示:

class Book < ActiveRecord::Base
  belongs_to :subject
end

我們在上面的示例中使用了單數 subject,因為一本書可以屬於單個主題。

class Subject < ActiveRecord::Base
  has_many :books
end

我們在上面的示例中使用了複數 books,因為一個主題可以有多本書。

實現驗證

驗證的實現是在 Rails 模型中完成的。您輸入資料庫的資料是在實際的 Rails 模型中定義的,因此在同一位置定義有效資料的內容才有意義。

開啟 **book.rb** 並新增以下驗證:

class Book < ActiveRecord::Base
  belongs_to :subject
  validates_presence_of :title
  validates_numericality_of :price, :message=>"Error Message"
end
  • **validates_presence_of** - 防止“NOT NULL”欄位缺少使用者輸入。
  • **validates_numericality_of** - 防止使用者輸入非數字資料。

除了上面提到的驗證之外,還有一些其他常見的驗證。檢視Rails 快速指南

接下來是什麼?

在下一章中,我們將學習 Rails 遷移,它允許您使用 Ruby 來定義對資料庫模式的更改,從而可以使用版本控制系統來使事物與實際程式碼保持同步。

廣告

© . All rights reserved.