在Rails 4中获取子类

时间:2013-08-27 15:46:44

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

我使用以下结构使用单表继承:

class Business < ActiveRecord::Base
end

class Restaurant < Business
end

class Bar < Business
end

并希望将子类列表作为字符串数组,因此对于Business - &gt; ['餐厅','酒吧']

关于我将如何处理的任何想法?

3 个答案:

答案 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