ActiveRecord不会使用STI构建正确的类

时间:2013-03-07 21:22:25

标签: ruby-on-rails ruby-on-rails-3 activerecord sti

我在我的应用程序中使用单表继承,并遇到从祖先构建继承用户的问题。例如,使用以下设置:

class School < ActiveRecord::Base

  has_many :users

end

class User < ActiveRecord::Base


  attr_accessible :type #etc...

  belongs_to :school

end

Class Instructor < User

   attr_accessible :terms_of_service
   validates :terms_of_service, :acceptance => true

end


Class Student < User

end

如何从学校的实例构建instructorstudent记录?尝试School.first.instructors.build(....)之类的内容只会为我提供一个新的用户实例,而且我无法访问教师特定的字段,例如terms_of_service,因此在生成教师时会导致错误从控制台构建的特定表单会给我一个质量分配错误(因为它正在尝试创建用户记录而不是指定的讲师记录)。我举了学校的例子,但是我想从User表继承一些其他的关联,所以我不必重复数据库中的代码或字段。我是否遇到此问题,因为无法在STI设置中共享关联?

3 个答案:

答案 0 :(得分:1)

您应该明确指定教师

class School < ActiveRecord::Base

  has_many :users
  has_many :instructors,:class_name => 'Instructor', :foreign_key => 'user_id'

end

答案 1 :(得分:1)

还有什么:

class School < ActiveRecord::Base
  has_many :users
  has_many :instructors
end

class Instructor < User 
  attr_accessible :terms_of_service # let it be at the first place. :)

  validates :terms_of_service, :acceptance => true
end

答案 2 :(得分:0)

好吧,似乎问题的一部分源于我的学校模型中的旧users关联。删除它并为学生和教师添加关联单独工作。

更新了 School.rb

class School < ActiveRecord::Base

  #removed:
  #has_many :users this line was causing problems

  #added
  has_many :instructors
  has_many :students

end