分享

[Rails][notes]Active Record Basics-官網閱讀紀錄[8]

記錄自己官網文件閱讀的注釋與筆記
主要也是訓練自己閱讀英文挑戰
https://guides.rubyonrails.org/getting_started.html
官網 文件 注釋 ActiveRecord rails

Image by Daniel Friesenecker from Pixabay

這一篇開始閱讀是Active Record 簡介
  • 閱讀後了解什麼是物件關聯的映射與Active Record 及如何使用它們
  • 如何適當的在Model-View-Controller使用Active Record 
  • 如何使用Active Record models操作對關聯是資料庫的存取
  • Active Record schema的命名方式
  • 資料數的migrations, validations, and callbacks 等概念

1 What is Active Record?

 Active Record是MVC中的M,一個model,在系統階層負責代表商業資料與邏輯。Active Record促進了商業物件的建立與使用這些商業物件對資料庫需要永久儲存。Active Record實做了一個物件關聯映射系統。
(解讀:作為資料庫與程式之間翻譯員的角色。讓開發者可以透過RUBY語法來操作資料庫)

1.1 The Active Record Pattern

Active Record 的描述來自 Martin Fowler 的著作Patterns of Enterprise Applicatio。在Active Record中物件包含了永續的資料以及對資料操作的行為。Active Record 確保資料存取邏輯的操作將是物件的一部分,並讓使用者學會如何對資料庫寫入及讀取。

1.2 Object Relational Mapping

Object Relational Mapping,通常稱為ORM,是一種連接豐富應用程式物件與關聯是資料庫中的資料表的技術,透過簡潔的程式碼並且不需撰寫SQL語法就可以輕鬆地將物件的屬性與關聯寫入關連式資料庫中。

1.3 Active Record as an ORM Framework

Active Record提供一些機制,最重要的有以下幾個
  • 表示model及資料
  • 表示model之間的關聯
  • 表示透過關聯的model之間繼承的關係
  • 在儲存資料到資料庫前進行驗證
  • 以物件導向的風格進行資料庫操作

2 Convention over Configuration in Active Record

慣例優於設定,當我們透過其他程式語言或框架撰寫應用程式,他可能需要撰寫許多設定與配置的程式碼,對於ORM框架更是如此,然而當你在建立Active Record時採用Rails 的約定,只需要撰寫很少的設定及配置,甚至不需要,這個想法是若你大多數執行相同配置在你的應用程式,那麼這些配置應該是默認的。所以僅在特數情況下不遵循約定而做明確的配置。

2.1 Naming Conventions

在默認情況下,Active Record使用一些命名的約定去尋找出對應的model與其資料庫。Rails 會將你的類別名稱轉成複數來找到對應的資料表,例如class BOOK 將會循找到對應的資了表 books(所以應該要建立或擁有books的資料表)Rails 的單複數轉換機制非常強大,能夠轉換常規及不規則的單字。若是使用兩個字或是多個字組成,在Rails中約定類別Class使用駝峰式而資料表透過底線來分開多個單字。
範例
Model Class -單數每個單字開頭必須大寫e.g., BookClub
Database Table 複數用底線分開e.g. , book_clubs
官網 文件 注釋 ActiveRecord rails

2.2 Schema Conventions

Active Record 對資料庫中資料表的命名約定,取決於這些資料表中欄位的功能
Foreign keys - singularized_table_name_id  (e.g., item_id, order_id)
在model之間建立關聯時,Active Record會查找這些字段
Primary keys- 屬於默認建立,Active Record 將其命名為id 資料型態為 integer (bigint for PostgreSQL and MySQL, integer for SQLite)
如果使用Active Record Migrations這個欄位會被自動建立
Active Record 提供了一些可額外添加的功能如下
  • created_at :資料建立時會自動添加當前的日期與時間
  • updated_at:資料更新時會自動添加當前的日期與時間
  • lock_version: 添加Optimistic Locking 在model
  • type:指定model 使用Single Table Inheritance.
  • (association_name)_type:儲存多態關聯的型態
  • (table_name)_count:用於快取關聯所屬物件的數量

3 Creating Active Record Models

建立一個Active Record models
  

class Product < ApplicationRecord

end

這裡建立一個Product model ,對應到products資料表
這樣做你可以對應到資料表的每個欄位
假設products table使用SQL建立
  

CREATE TABLE products (

  id int(11) NOT NULL auto_increment,

  name varchar(255),

  PRIMARY KEY  (id)

);

在schema上使用兩列來描述:id 跟:name,這個資列表的每一行都代表具有這兩個屬性的產品
  

p = Product.new

p.name = "Some Book"

puts p.name # "Some Book"

4 Overriding the Naming Conventions

如果需要遵循不同的命名約定或者將Rails搭配不同的資料庫,你可以覆寫
命名約定。
ApplicationRecord繼承自ActiveRecord::Base,你可以使用ActiveRecord::Base.table_name= 來指定資料表名稱:
  

class Product < ApplicationRecord

  self.table_name = "my_products"

end

如果更改資料表名稱,在測試中你將使用set_fixture_class手動設定fixture 的類別名稱
  

class ProductTest < ActiveSupport::TestCase

  set_fixture_class my_products: Product

  fixtures :my_products

  # ...

end

也能夠修改主鍵名稱
  

class Product < ApplicationRecord

  self.primary_key = "product_id"

end

5 CRUD: Reading and Writing Data

Active Record自動創建方法使其 早做資料表中的資料存取

5.1 Create

Active Record objects 可以透過hash、block 、或是手動設立屬性
new 方法會回傳一個新建立的物件,而create 方法將會回傳一個新的物件並在資料庫儲存它
以下是一個例子給訂一個model User擁有屬性name and occupation
而呼叫create將建立並且儲存一筆新的紀錄
  

user = User.create(name: "David", occupation: "Code Artist")

使用new 則不會儲存
  

user = User.new

user.name = "David"

user.occupation = "Code Artist"

若要儲存這筆資料使用user.save 將資料存進資料庫
最後使用區塊的例子,用new來做一個初始化
  

user = User.new do |u|

  u.name = "David"

  u.occupation = "Code Artist"

end

5.2 Read

Active Record 提供豐富的API來對資料庫存取資料

  

# return a collection with all users 返回所有user

users = User.all

# return the first user 返回第一個user

user = User.first

# return the first user named David 返回第一個名為David的user

david = User.find_by(name: 'David')

# find all users named David who are Code Artists and sort by 

#created_at in reverse chronological order

#返回所有叫name為David並且occupation為Code Artist 的user 並對其建#立時間做反向排序


users = User.where(name: 'David', occupation: 'Code Artist').order(created_at: :desc)



5.3 Update

更新資料透過檢所欲修改的料更改後儲存回資料庫
  

user = User.find_by(name: 'David')

user.name = 'Dave'

user.save

使用Hash 快速的執行修改
  

user = User.find_by(name: 'David')

user.update(name: 'Dave')

一次性修改多個屬性
  

User.update_all "max_login_attempts = 3, must_change_password = 'true'"

5.4 Delete

若要刪除資料可以使用
  

user = User.find_by(name: 'David')

user.destroy

若是要刪除多筆
  

# find and delete all users named David

 User.destroy_by(name: 'David')

 # delete all users 

 User.destroy_all

6 Validations

Active Record允許在寫入資料庫時做驗證資料
提供了許多方法可以驗證寫入資料是否為空,或是重複存在資料庫,
或著指定格式。驗證是將資料用續保存在資料庫中的一個重要議題。
若是驗證後回傳是false,save and update 將會中斷不會繼續執行。
  

class User < ApplicationRecord

  validates :name, presence: true

end


  

user = User.new

user.save

user.save!

若是使用save! and update! 將會強制儲存,但會提出警告
#ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

7 Callbacks

Active Record Callback 允許在model 生命週期中對特定事件附加程式碼
請參考:Active Record Callbacks

8 Migrations

Rails 提供一個處理資料庫DSL叫做migration,可以讓其使用Active Record針對支援的資料庫建立資料表
  

class CreatePublications < ActiveRecord::Migration[6.0]

  def change

    create_table :publications do |t|

      t.string :title

      t.text :description

      t.references :publication_type

      t.integer :publisher_id

      t.string :publisher_type

      t.boolean :single_issue


      t.timestamps

    end

    add_index :publications, :publication_type_id

  end

end

Rails 將持續追蹤提交到資料庫的檔案,並提供回朔的功能
要建立一個資料表只需要執行rails db:migrate,要回朔則執行
db:rollback
#官網  #文件  #注釋  #ActiveRecord  #rails 
分類:學習

評論
上一篇
  • [Rails][notes]刪除評論與簡易的身份認證-官網閱讀紀錄[7]
  • 下一篇
  • [Rails][notes]Active Record Migrations(1)-官網閱讀紀錄[9]
  • 更多文章
    載入中... 沒有更多了