19
A
回答
0
在初始化函數檢查該類是STI基類。
雖然問題是你爲什麼要這麼做?看起來更有可能嘗試一種不同的設計可能會對您有所幫助。
-4
你可以在基類中做self.abstract_class = true
告訴ActiveRecord它是一個抽象類。
3
你可以試試這個:
class BaseClass
def initialize
raise "BaseClass cannot be initialized" if self.class == BaseClass
end
end
class ChildClass
end
的結果將是:
a = BaseClass.new # Runtime Error
b = ChildClass.new # Ok
希望幫助
40
由約翰·託普利答案其實是錯誤的。在基類中設置abstract_class = true實際上會導致子類自動停止設置其類型。另外,除非你在基類中使用set_table_name,否則子類將會抱怨他們的表不存在。
這是因爲abstract_class = true的目的是在不使用STI時設置繼承,並且希望在ActiveRecord :: Base之間的類層次結構中有一個抽象類(類不支持db表)和一個或多個模型類。
初始化raise是一種解決方案,同時向基類添加validates_presence_of:type是一個解決方案。
注意如果覆蓋初始化,你需要調用超:
def initialize(*args)
raise "Cannot directly instantiate an AbstractUser" if self.class == AbstractUser
super
end
+0
爲什麼這個答案不在答案的頂部?它位於0票和另一票被刪除的答案下面。 – 2016-09-15 19:34:47
0
我經常喜歡簡單地讓new
類方法的私人用:
class Base
private_class_method :new
end
這樣的意外實例基類觸發錯誤,但仍可以使用Base.send(:new)
實例化它,爲基類編寫測試。
相關問題
- 1. 阻止類被實例化
- 2. Rails form_for使用STI基類
- 3. 動態實例化Rails嵌套STI子類?
- 4. Rails子類化和STI
- 5. Rails STI條件分類從基類
- 6. 如何阻止創建基類實例的可能性?
- 7. React類實例prop阻止使用PureComponent
- 8. 顯式實例化C++類模板實例化相關基類?
- 9. PHP阻止父類從多個孩子實例化?
- 10. 我可以阻止實例化非模板類嗎?
- 11. Python抽象類 - 如何阻止實例化?
- 12. 阻止類實例化standalone,從工廠啓用
- 13. Rails STI:實現子類編輯表格
- 14. Rails的基於STI型
- 15. Rails has_many STI
- 16. 實例化基類 - Win32對話框類
- 17. 防止其他類的類實例化
- 18. 防止STI
- 19. C++:防止抽象基類的任何實例化的方法?
- 20. 聲明驗證阻止實例變量
- 21. 允許訪問,但通過外部類阻止嵌套類的實例化
- 22. Rails STI更改類型
- 23. 基於請求參數實例化類
- 24. 從基類實例化派生對象
- 25. 防止抽象類實例化
- 26. 如何在使用STI時使用Rails的.build_方法實例化子對象?
- 27. Rails STI路由
- 28. 通過「刪除」複製構造函數來阻止C++ 11類的實例化
- 29. 阻止@ApplicationScoped CDI受管bean的手動實例化
- 30. 阻止Firefox的多個實例
由於BaseClass可能會從ActiveRecord :: Base下降,初始化應該可能會調用super。 – Douglas 2014-01-18 17:33:56