我使用以下结构使用单表继承:
class Business < ActiveRecord::Base
end
class Restaurant < Business
end
class Bar < Business
end
并希望将子类列表作为字符串数组,因此对于Business - &gt; ['餐厅','酒吧']
关于我将如何处理的任何想法?
答案 0 :(得分:3)
这是处理它的一种方法。
意见我个人喜欢这种方法,因为父类可以在子类继承父类时定义特定的行为或配置
class Business
@@children = []
def self.inherited(klass)
@@children << klass
end
def self.children
@@children
end
end
class Restaurant < Business; end
class Bar < Business; end
让我们看看它是否有效
Business.children
#=> [Restaurant, Bar]
答案 1 :(得分:2)
你可以这样做:
Business.descendants.map {|klass| klass.name.demodulize } #generally I nest descendant in the main class namespace, hence the demodulize
顺便说一下,由于Rails开发环境原则,开发时可能会遇到问题。
示例,如果您使用范围:Business.a_scope
,则可能会遇到问题。
已知并且已知的方法是将id添加到主类的底部(Business
这里),例如:
your_children_types.each do |type|
require_dependency "#{Rails.root}/app/models/#{ path_to_your_child(type) }"
end
答案 2 :(得分:0)
没有声誉可以对@ naomik的答案发表评论,但是如果您使用的是Rails,请记住在添加继承方法后添加'super',例如:
def self.inherited(klass)
@@children << klass
super # this is 'super' important to not wipe out Rails' descendant tracker
end