Рельсы МТИ с полиморфизмом - PullRequest
3 голосов
/ 07 июня 2011

Представьте себе сценарий:

У меня есть класс с разными типами учеников.У всех студентов есть похожие атрибуты, но у каждого типа студентов также есть уникальные атрибуты.Поэтому я использовал MTI, чтобы сохранить общие атрибуты в таблице студентов и отдельные атрибуты в их соответствующей таблице, а также полиморфизм для абстрагирования типа студента при работе с ними с точки зрения класса.Я следовал этому уроку: http://techspry.com/ruby_and_rails/multiple-table-inheritance-in-rails-3/.

Из этого я попал в следующие модели:

class Clazz < ActiveRecord::Base
  has_many :students
end

class Student < ActiveRecord::Base
  belongs_to :stu, :polymorphic => true
  belongs_to :clazz
end

class Student1 < ActiveRecord::Base
  has_one :student, :as => :stu
end

class Student2 < ActiveRecord::Base
  has_one :student, :as => :stu
end

Моя проблема возникает, когда я хочу создать экземпляр конкретного ученика (косвенно связанного с классом черезученик).Я не могу сделать это из класса, потому что у него нет связи с конкретными учениками, и когда я пытаюсь создать экземпляр непосредственно, он говорит, что не распознает поле «: class».

Student1.new(:clazz => @clazz, ... [other atributes]...)

unknown attribute: :class

Может кто-нибудь дать мне подсказку о том, как этого добиться?Tks

Ответы [ 2 ]

1 голос
/ 31 июля 2012

Проверьте решение здесь: http://mediumexposure.com/multiple-table-inheritance-active-record/

, который похож на http://techspry.com/ruby_and_rails/multiple-table-inheritance-in-rails-3/.

но по моему опыту первое лучше. для одного это реализует method_missing, чего последний не делает.

1 голос
/ 08 июня 2011

По сути, @Aaron пытается спросить, выполняет ли эта работа:

class Student < ...
  belongs_to :clazz
end

class Student1 < ...
  has_one :student, :as => :stu

  accepts_nested_attributes_for :stu
end

Student1.new(:stu => {:clazz => @clazz},...[other attributes])

ActiveRecord по умолчанию не оказывает вам никакой помощи, когда вам нужно инициализировать деревья таких объектов.

...