Rails活動記錄是Rails提供的對象/關係映射(ORM)層。它緊跟標準ORM模型,如下所示;
- tables map to classes,
- rows map to objects and
- columns map to object attributes.
Rails活動記錄在關係資料庫中的表和處理資料庫記錄的Ruby程序代碼之間提供接口和綁定。Ruby方法名是從資料庫表的欄位名自動生成的。
每個活動記錄對象都有用於資料庫訪問的CRUD(C創建、R讀取、u更新和D刪除)方法。此策略允許在資料庫表和應用程式對象之間進行簡單的設計和直接映射。
Translating a Domain Model into SQL
將域模型轉換成SQL通常是直接的,只要您記住必須編寫對Rails友好的SQL。實際上,你必須遵守某些規則;
每個實體(如book)都在資料庫中獲取一個以其命名的表,但使用複數形式(books)。
每個這樣的實體匹配表都有一個名爲id的欄位,該欄位包含插入表中的每條記錄的唯一整數。
給定實體x和實體y,如果實體y屬於實體x,那麼表y有一個名爲x_id的欄位。
任何表中的大部分欄位存儲該實體的簡單屬性(任何數字或字符串)的值。
Creating Active Record Files (Models)
要爲庫應用程式的實體創建活動記錄文件(在上一章中介紹),請從應用程式目錄的頂層發出以下命令。
library\> rails script/generate model Book library\> rails script/generate model Subject
上面的rails generate model book命令生成如下所示的自動代碼−
您告訴生成器創建名爲Book和Subject的模型,以存儲書籍和主題的實例。請注意,您正在將書籍和主題大寫,並使用單數形式。這是一個Rails範例,每次創建模型時都應該遵循它。
當您使用generate工具時,Rails會創建一個實際的模型文件,其中包含您定義的模型和業務規則所特有的所有方法,一個用於執行測試驅動開發的單元測試文件,一個用於單元測試的示例數據文件(稱爲fixture),以及一個Rails遷移,它使創建資料庫表和列變得容易。
除了創建許多其他文件和目錄外,還將創建名爲book.rb和subject.rb的文件,其中包含app/models目錄中的框架定義。
book.rb−中提供的內容;
class Book < ActiveRecord::Base end
subject.rb−中提供的內容;
class Subject < ActiveRecord::Base end
Creating Associations between Models
當rails應用程式中有多個模型時,需要在這些模型之間創建連接。你可以通過聯想來做到這一點。活動記錄支持三種類型的關聯−
一對一−當一個項正好有另一個項時,就存在一對一關係。例如,一個人只有一個生日,或者一條狗只有一個主人。
當一個對象可以是許多其他對象的成員時,就存在一對多關係。例如,一門學科可以有許多書。
當第一個對象與第二個對象中的一個或多個相關,而第二個對象與第一個對象中的一個或多個相關時,就存在多對多關係。
通過向模型中添加聲明來指示這些關聯:hasúone、hasúmany、belongsúto,以及hasúandúbelongs戔to戔many。
現在,您需要告訴Rails您希望在庫數據系統中建立什麼關係。爲此,請將book.rb和subject.rb修改爲如下所示&負;
class Book < ActiveRecord::Base belongs_to :subject end
我們在上面的例子中使用了一個單獨的主題,因爲一本書可以屬於一個單獨的主題。
class Subject < ActiveRecord::Base has_many :books end
我們在這裡使用了複數本,因爲一個主題可以有多本書。
Implementing Validations on Models
驗證的實現是在Rails模型中完成的。您輸入到資料庫中的數據是在實際的Rails模型中定義的,因此只有在相同的位置定義哪些有效數據才有意義。
驗證結果爲&負;
- The value of title field should not be NULL.
- The value of price field should be numeric.
打開app\model子目錄中的book.rb,並輸入以下驗證值−
class Book < ActiveRecord::Base belongs_to :subject validates_presence_of :title validates_numericality_of :price, :message=>"Error Message" end
驗證是否存在−可防止「非空」欄位丟失用戶輸入。
驗證−的數字性,防止用戶輸入非數字數據。
除了上面提到的驗證之外,還有其他常見的驗證。檢查rails快速指南。
What is Next?
在下一章中,我們將學習Rails遷移,它允許您使用Ruby定義對資料庫模式的更改,從而可以使用版本控制系統使事情與實際代碼保持同步。