Rails中的模型继承

时间:2015-08-01 17:45:19

标签: ruby-on-rails ruby ruby-on-rails-4 inheritance associations

我有一个班级Item和另一个Weapon。它们共享很多相同的状态(例如sizevalue),但Weapon有一些额外的内容,例如damagecritical和{{ 1}}。在原始Ruby中,我将这些公共属性提取到模块并组合它们,或者我可以从threat继承Weapon并将公共状态放在超类中。

除了我正在使用Rails。单表继承似乎不是一个很好的解决方案,因为Item有许多属性不在Weapon中,我不喜欢所有空DB列。多态关联也不正确,因为它似乎更有用于共享模型之间的关联,而不是共享状态。使用关注:大致相同的问题。

Rails中有什么东西允许我在另一个模型中扩展单个模型的状态,同时为任何其他属性构建一个额外的表吗?

这是我在原始Ruby中喜欢的代码示例:

Item

在Rails中,可以尝试将class Item attr_accessor :value, :weight, item_type class Weapon < Item attr_accessor :damage, :threat, :critical, :weapon_type Weapon.new(value: 12) # => weapon instance with value 12 添加到item_id - 但是我不能Weapon,我必须Weapon.new(value: 12)

1 个答案:

答案 0 :(得分:0)

TL; DR这违反了Liskov Substitution Principle,所以我不应该这样做。

根据Liskov的说法,对象子类型应该是可以互换的 - 也就是说,如果我为Weapon或者Weapon切换Potion,那么使用Gem类实例的方法应该有效$(document).ready(function () { setInterval(function() { $.ajax({ url: '/number.php', type: 'get', success: function (output) { $(document.body).append(output); } }); }, 1000); }); 。显然,事实并非如此:所以从OOP的角度来看,我不应该在这里使用继承。

感谢您的辩论!