ruby-on-rails – 使用基类与基本模块重构ActiveRecord模型
发布时间:2020-12-16 20:14:22 所属栏目:百科 来源:网络整理
导读:A级和B级相同: class A ActiveRecord::Base def foo puts "foo" endendclass B ActiveRecord::Base def foo puts "foo" endend 与基类重构这样做有什么区别? class Base ActiveRecord::Base def foo puts "foo" endendclass A Baseendclass B Baseend 相对
A级和B级相同:
class A < ActiveRecord::Base def foo puts "foo" end end class B < ActiveRecord::Base def foo puts "foo" end end 与基类重构这样做有什么区别? class Base < ActiveRecord::Base def foo puts "foo" end end class A < Base end class B < Base end 相对于使用基本模块: module Base def foo puts "foo" end end class A < ActiveRecord::Base include Base end class B < ActiveRecord::Base include Base end 一种方式比另一种更好吗? 解决方法
在所有其他答案都丢失的两种方法之间存在根本区别,也就是STIs(单表继承)的实现:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html(查找“单表继承”部分) 基本上,如果你像这样重构Base类: class Base < ActiveRecord::Base def foo puts "foo" end end class A < Base end class B < Base end 那么你应该有一个名为“bases”的数据库表,其中一个名为“type”的列应该有一个值“A”或“B”.这个表格上的列在所有的模型中都是一样的,如果你的列只属于其中一个模型,那么你的“基础”表将被非规范化. 而如果您像这样重构Base类: Module Base def foo puts "foo" end end class A < ActiveRecord::Base include Base end class B < ActiveRecord::Base include Base end 那么就不会有“基地”.相反,会有一个表“as”和一个表“bs”.如果它们具有相同的属性,列将必须在两个表中重复,但是如果存在差异,则它们不会被denomarlized. 所以,如果一个比另一个更好,是的,但这是特定于你的应用程序.根据经验,如果它们具有完全相同的属性或大的重叠,则使用STI(第一个例子),否则使用模块(第二个例子). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |