Ruby on Rails - 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 檔案,請從應用程式目錄的頂層發出以下命令。

library\> rails script/generate model Book
library\> rails script/generate model Subject

上面的 **rails generate model book** 命令會生成如下自動程式碼:

Book Generate

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

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

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

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,因為一本 Book 可以屬於一個 Subject。

class Subject < ActiveRecord::Base
   has_many :books
end

我們在這裡使用了複數 books,因為一個 subject 可以有多本書。

在模型上實現驗證

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

驗證包括:

  • title 欄位的值不能為 NULL。
  • price 欄位的值必須為數字。

開啟 **app\model** 子目錄中的 **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 Migration,它允許您使用 Ruby 來定義資料庫模式的更改,從而可以使用版本控制系統來使實際程式碼保持同步。

廣告
© . All rights reserved.