【问题标题】:Rails single table inheritance ActiveRecord::SubclassNotFoundRails 单表继承 ActiveRecord::SubclassNotFound
【发布时间】:2015-02-07 00:35:42
【问题描述】:

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

单表继承机制找不到子类:'nil'。引发此错误是因为“类型”列保留用于在继承的情况下存储类。如果您不打算将该列用于存储继承类或覆盖 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'

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

我可以告诉它覆盖它并更改类型吗?

编辑:

我试过了:

User.last (I was the last user)

User.find(*myId*)

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

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

【问题讨论】:

  • 你写的是"nil"还是nil?后者应转换为 SQL 的NULL。提供您尝试过的代码示例和准确的输出。
  • @D-side 我实际上写了“nil”,所以它可能正在寻找“nil”的实际类型 - 我尝试创建一个实际上称为“nil”的新模型,它继承自 User 并且它仍然不会让我进行更改,我假设因为它现在是小写的。
  • 这可能是真的。尽管如此,您在控制台(和输出)中运行的代码的 sn-ps 仍然会有所帮助。将它们添加到问题中。顺便说一句,代码在问题中通过缩进 4 个空格来指定。
  • 好的,我添加了上面使用的命令来访问我的用户记录,控制台每次都给我同样的错误,以及我的 Rails 错误消息。
  • 试试User.where(type: "nil").update_all(type: nil)

标签: ruby-on-rails activerecord


【解决方案1】:

好吧,你有点搞砸了:)

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

很容易解决。选择所有错误条目(在type 中包含"nil")并修复它们(将type 设置为nil,这将成为SQL NULL,这意味着这里的“基类”):

User.where(type: "nil").update_all(type: nil)

【讨论】:

  • 谢谢。 “确切的班级名称”对我来说是缺失的部分。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多