Rails Single-Table Inheritance (STI): зависимости от производных моделей - PullRequest
0 голосов
/ 07 ноября 2011

Я собираюсь использовать STI в своем приложении Rails 2.3.

Я смоделировал это следующим образом:

Базовый класс:

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: тариф , я получаю неопределенный метод тарификации_periods для тарифа . Как я должен идти о моделировании этого сценария? Должен ли я поместить ассоциацию has_many в родительский класс?

1 Ответ

0 голосов
/ 07 ноября 2011

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 в Agile Web Development с Rails, 3-е издание

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

...