0

我即将在我的 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 :tariff时,我得到了一个未定义的方法 `tariffing_periods' 用于 Tariff。我应该如何对这种情况进行建模?我应该把 has_many 关联放在父类上吗?

4

1 回答 1

0

STI 通常在 Rails 中像这样完成:

class Tariff < ActiveRecord::Base
end

class FlatRateTariff < Tariff
end

class TimeOfUseTariff < Tariff
end

确保 Tariff 表有一个属性type:string——ActiveRecord 存储类名的地方

你不需要这个:(你可以检查.class

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

这里有更多信息:

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

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

于 2011-11-07T04:18:33.347 回答