跳至內容 跳至搜尋

單表繼承

Active Record 允許透過在預設名稱為「type」的欄位中儲存類別名稱來達成繼承(可透過覆寫 Base.inheritance_column 來變更)。這表示如果繼承看起來像這樣

class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end

當你執行 Firm.create(name: "37signals") 時,這筆記錄會儲存在 companies 資料表中,其中 type = "Firm"。然後你可以使用 Company.where(name: '37signals').first 再次擷取這個 row,這將會回傳一個 Firm 物件。

請注意因為 type 欄位是記錄上的屬性,所以每個新的子類別將會立即標示為已變更,type 欄位也會包含在記錄上的已變更屬性清單中。這與非單表繼承 (STI) 類別不同

Company.new.changed? # => false
Firm.new.changed?    # => true
Firm.new.changes     # => {"type"=>["","Firm"]}

如果您沒有在資料表中定義 type 欄位,則單表繼承不會觸發。在這種情況下,它將與一般子類別一起運作,而不會有區分這些子類別或透過 find 重新載入正確類型的特殊處理。

請注意,所有案例的所有屬性都會保留在同一張資料表中。閱讀更多資訊

命名空間
方法
I

執行個體公開方法

initialize_dup(other)

# File activerecord/lib/active_record/inheritance.rb, line 343
def initialize_dup(other)
  super
  ensure_proper_type
end