在ActiveRecord上存儲繼承的唯一完全支持策略是STI。但是,您可以自行承擔風險,模擬具體的類表繼承。正如smathy指出的那樣,具有抽象超類的具體類表繼承工作正常。
但是......如果你想要製作另一部分只是一個普通的類(它不會被持久化在數據庫中),你可以禁用鑑別器列(如Veraticus所建議的那樣)。但是,如果您保存AnotherSection將在同一個表的部分依然存在,你將不能夠告訴他們分開。另外,如果你使用AnotherSection找到科,它會返回一個AnotherSection,打破了原有的實例:
#create a Section and saves it
sect = Section.create()
sect.save()
#retrieve the Section as a AnotherSection, breaking polymorphism...
sect = AnotherSection.find(sect.id)
# another section is more than a section, it is inconsistent.
如果AnotherSection並不打算堅持着,最安全的路徑它覆蓋持久化操作,如保存()和find():
class AnotherSection < Section
# disable STI, as pointed by Veraticus
self.inheritance_column = :_type_disabled
# disable save and finding
def save(*args)
#exception? do nothing?
end
def find(*args)
#exception? do nothing?
end
def find_by(*args)
#exception? do nothing?
end
# this does not stops here! there is first, last, and even a forty_two finder method! not to mention associations...
end
概括地說,你可以這樣做,但你SHOULDN'T。風險很高。 你應該考慮其他選項,比如使用MIXIN,而不是繼承的。
,如果你沒有一個'type'列,不應該打擾你......如果你有一個'type',那麼你可以做什麼@Veraticus表示禁用它.. – shuriu 2012-07-26 19:19:01
其實你還是有STI:來自兩個類的實例將存儲在同一個表中,STI(Single Table Inheritance)的定義是什麼。你只是不想有鑑別器列(「類型」)。但是,如何知道段中的每條記錄是普通段還是AnotherSection? – atorres 2017-01-21 16:13:28