Rails MTI具有多态性

时间:2011-06-07 17:00:15

标签: ruby-on-rails inheritance multi-table

想象一下这个场景:

我有一个班级,有不同类型的学生。所有学生都有类似的属性,但每种类型的学生也有独特的属性。所以我使用MTI来保持表中学生和各个表中的公共属性,以及从类视角处理学生类型时的polimorphism。我遵循了本教程: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 个答案:

答案 0 :(得分:1)

基本上@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不会对您有所帮助。

答案 1 :(得分:1)

在这里查看解决方案: http://mediumexposure.com/multiple-table-inheritance-active-record/

类似于 http://techspry.com/ruby_and_rails/multiple-table-inheritance-in-rails-3/

但从我的经验来看,前者更好。一,它实现method_missing, 后者不这样做。