Rails单表继承ActiveRecord::SubclassNotFound

asa*_*gan 0 activerecord ruby-on-rails

我尝试将用户类型更改为“nil”,但现在不断收到此错误消息:

单表继承机制无法定位子类:'nil'。引发此错误的原因是“type”列被保留用于在继承时存储类。如果您不打算将此列用于存储继承类,请重命名该列,或覆盖 User.inheritance_column 以使用另一列来存储该信息。

from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/inheritance.rb:161:in `rescue in find_sti_class'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/inheritance.rb:155:in `find_sti_class'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/inheritance.rb:144:in `discriminate_class_for_record'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/persistence.rb:50:in `instantiate'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/querying.rb:48:in `block in find_by_sql'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/result.rb:55:in `block in each'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/result.rb:55:in `each'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/result.rb:55:in `each'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/querying.rb:48:in `map'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/querying.rb:48:in `find_by_sql'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation.rb:603:in `exec_queries'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation.rb:487:in `load'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation.rb:231:in `to_a'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/bullet-4.13.1/lib/bullet/active_record41.rb:10:in `to_a'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation/finder_methods.rb:479:in `find_last'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation/finder_methods.rb:165:in `last'
Run Code Online (Sandbox Code Playgroud)

我明白为什么会发生这种情况,并且我确实希望发生单表继承,但它甚至不允许我覆盖它 Rails Console。我正在尝试将用户类型更改回我需要的类型,它立即给我该消息。即使我执行 User.find( myID ) 它也不会提取我的数据。

有什么办法我可以告诉它覆盖它并更改类型吗?

编辑:

我试过:

User.last (I was the last user)

User.find(*myId*)
Run Code Online (Sandbox Code Playgroud)

它甚至不让我做User.last.destroyor User.destroy_all,每次在控制台中都会给我同样的错误。

我还尝试创建一个名为“nil”的模型,该模型继承自 User 但仍然没有任何结果。

D-s*_*ide 6

好吧,你有点搞砸了:)

Rails 的单表继承需要字段中的确切类名type。由于"nil"未指定有效的User子类,因此您创建的对象在 STI 方面没有任何意义。

这很容易修复。选择所有错误条目(包含"nil"在 中type)并修复它们(设置typenil,这将成为NULL此处表示“基类”的 SQL):

User.where(type: "nil").update_all(type: nil)
Run Code Online (Sandbox Code Playgroud)