單表繼承
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 重新載入正確類型的特殊處理。
請注意,所有案例的所有屬性都會保留在同一張資料表中。閱讀更多資訊
命名空間
方法
執行個體公開方法
initialize_dup(other) 連結
來源:顯示 | 在 GitHub 上
# File activerecord/lib/active_record/inheritance.rb, line 343 def initialize_dup(other) super ensure_proper_type end