Rails单表继承(STI):对派生模型的依赖性

时间:2011-11-07 04:06:57

标签: ruby-on-rails sti

我即将在我的Rails 2.3应用程序中使用STI。

我用以下方式对其进行了建模:

基类:

class Tariff < ActiveRecord::Base
  def self.inherited(child)
    child.instance_eval do
      def model_name
        Tariff.model_name
      end
    end
    super
  end

  def self.select_options
    descendants.map { |c| c.to_s }.sort
  end
end

其子类:

class FlatRateTariff < Tariff
end

class TimeOfUseTariff  < Tariff
  has_many :tariffing_periods, :dependent => :destroy
  accepts_nested_attributes_for :tariffing_periods, :allow_destroy => true
end

当我尝试创建 form_for:关税时,我正在为关税获得未定义的方法`tariffing_periods'。我该如何对这种情况进行建模?我应该在父类上放置has_many关联吗?

1 个答案:

答案 0 :(得分:0)

STI通常在Rails中完成:

class Tariff < ActiveRecord::Base
end

class FlatRateTariff < Tariff
end

class TimeOfUseTariff < Tariff
end

确保“关税”表格具有属性type:string - 这就是ActiveRecord存储类名称的位置

您不需要:(而是可以检查 .class

 def self.inherited(child)
    child.instance_eval do
      def model_name
        Tariff.model_name
      end
    end
    super
  end

这里有更多信息:

第373页,使用Rails进行Agile Web开发,第3版

或: http://my.safaribooksonline.com/book/web-development/ruby/9780132480345/advanced-active-record/ch09lev1sec5