具有多态性的Rails MTI



想象一下场景:

我有一个班,有不同类型的学生。所有的学生都有相似的特质,但每种类型的学生也有独特的特质。因此,我使用MTI来保留表中的公共属性students和各自表中的单独属性,并使用polimorpism来抽象从类角度处理它们时的学生类型。我遵循了本教程: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

基本上@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默认情况下不会给您带来任何好处。

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

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

但根据我的经验,前者更好。一是实现了method_missing,后者做不到。

相关内容

  • 没有找到相关文章

最新更新