我正在使用Ruby on Rails 2.3.10。我有一堂課,School
。我用STI給我幾個小類:PrimarySchool
,SecondarySchool
和University
。如預期在Rails中使用STI時ActiveRecord :: SubclassNotFound錯誤
app/models/primary_school.rb:
class PrimarySchool < School
has_many :education_records, :foreign_key => "school_id"
end
app/models/secondary_school.rb:
class SecondarySchool < School
has_many :education_records, :foreign_key => "school_id"
end
app/models/university.rb
class University < School
has_and_belongs_to_many :applicants, :join_table => :applicants_schools, :foreign_key => "school_id"
end
db/migrate/20100824170203_create_schools.rb:
class CreateSchools < ActiveRecord::Migration
def self.up
create_table :schools do |t|
t.string :name
t.string :type # secondary, cegep, college, university
t.string :street
...
t.timestamps
end
end
def self.down
drop_table :schools
end
end
PrimarySchool.first
和PrimarySchool.last
工作。 SecondarySchool.first
和SecondarySchool.last
按預期工作。 University.last
作品。
然而,University.first
和University.all
養ActiveRecord::SubclassNotFound
例外:
ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass: 'University'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite University.inheritance_column to use another column for that information.
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1671:in `instantiate'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:665:in `find_by_sql'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:665:in `collect!'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:665:in `find_by_sql'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1582:in `find_every'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:619:in `find'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:639:in `all'
from (irb):6
from :0
生成的SQL是正確的:
SecondarySchool Load (0.3ms) SELECT * FROM `schools` WHERE ((`schools`.`type` = 'University')) LIMIT 1
SecondarySchool Load (1.7ms) SELECT * FROM `schools` WHERE ((`schools`.`type` = 'University')) ORDER BY schools.id DESC LIMIT 1
我缺少/做錯了嗎?
class School
2010-11-09 22:04:30
這對我不起作用。還嘗試了./script/console製作並仍然看到錯誤。 – 2010-11-09 22:05:13
這對我來說很合適,但現在我需要記得在我更改所說的子類時重新啓動rails server。謝謝。 – 2012-01-06 06:10:06