【问题标题】:Rails 5 - PG::UndefinedTable: ERROR: relation "application_records" does not existRails 5 - PG::UndefinedTable:错误:关系“application_records”不存在
【发布时间】:2016-06-12 05:49:49
【问题描述】:

我正在尝试使用 postgresql 设置 Rails 5 应用程序(ruby 2.3.1,rails 5.0.0.rc1),设计 gem 并且它无法运行 rails db:seed 由于出现以下错误:

PG::UndefinedTable: ERROR:  relation "application_records" does not exist
LINE 8:                WHERE a.attrelid = '"application_records"'::r...
                                          ^
/Users//.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/postgresql/database_statements.rb:88:in `async_exec'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/postgresql/database_statements.rb:88:in `block in query'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:566:in `block in log'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activesupport-5.0.0.rc1/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract_adapter.rb:560:in `log'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/postgresql/database_statements.rb:87:in `query'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/postgresql_adapter.rb:739:in `column_definitions'
/Users/foo/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/postgresql/schema_statements.rb:227:in `columns' 

经过多次谷歌搜索,我意识到这与ApplicationRecord base class change in rails 5 有关。显然没有名为 application_records 的表,因此 active_support 不应该寻找它。我已经检查过app/models/application_record.rb 存在并且内容正确。此外,User 模型(这是我的应用程序中目前唯一的模型)按预期扩展了 ApplicationRecord:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, 
         :recoverable, :rememberable, :trackable, :validatable
end

rails db: migrate 运行良好,但 rails db:seed 因上述错误而窒息。

任何人都可以阐明可能导致这种情况的原因吗?

application_record.rb的内容:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

【问题讨论】:

  • 你的application_record.rb文件的内容是什么?
  • 将 application_record.rb 的内容添加到问题中
  • 谢谢。我创建了一个示例 5.0 RC 应用程序,但无法重现此问题。我建议在 Rails 问题跟踪器上打开一个问题 - github.com/rails/rails/issues - 将示例应用程序上传到 Github 以重现该问题。在 Github 问题上将我标记为 @prathamesh-sonpatki。谢谢。
  • 感谢@PrathameshSonpatki。我已经在 github 上上传了我的项目,并按照您的建议提交了一个错误:github.com/rails/rails/issues/25379。我也找到了这个解决方法:如果我在我的用户模型中添加self.table_name = 'users',一切正常。

标签: postgresql devise ruby-on-rails-5


【解决方案1】:

PG::UndefinedTable: ERROR:  relation "application_records" does not exist

如果删除该行也会发生错误:

self.abstract_class = true

来自app/models/application_record.rb

这一行让 Rails 知道这不是一个应该持久化到数据库的模型,这里有一个很好的 Rails 抽象类摘要:https://medium.com/@jeremy_96642/deep-rails-how-to-use-abstract-classes-6aee9b686e75

【讨论】:

  • 这是我的问题。为了部署到 Heroku,我不得不将我的 RoR 应用程序从 3 个数据库降级到 1 个。这样做时,我过于雄心勃勃地删除了模型中的线条,并从 app/models/application_record.rb 中删除了 self.abstract_class = true。感谢@agbodike 提供此解决方案!
【解决方案2】:

回答我自己的问题,这样可以帮助遇到类似问题的其他人。

正如@PrathameshSonpatki 在rails issue 上提到的那样,这是因为userstamp gemActiveRecord::Base 而不是ApplicationRecord 上注入了关系。 (请注意,在撰写本文时,userstamp gem 与 rails 5 不兼容)。

如果您有一个尚未使用 rails 5 测试的 gem,并且遇到 active_support 查找名为 application_records 的表的问题,请检查您正在使用的其中一个 gem 是否在 ActiveRecord::Base 类上注入了关系。基于this blog postApplicationRecord的真正目的是避免ActiveRecord::Base的全局注入。因此,您需要寻找与 Rails 5 兼容的此类 gem 的版本或修补此类 gem 以将必要的行为注入 ApplicaitonRecord 而不是 ActiveRecord::Base

【讨论】:

  • 我想知道找到破坏我们应用程序的 gem 的最佳方法是什么。我们有几百个,userstamp 不在那里。
  • @Izap 我有一个名为gem_bench 的gem,它允许您通过grep 搜索捆绑在项目中的所有gem 的源代码,因此您可以查找类似的东西。 github.com/pboling/gem_bench
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2020-05-08
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2021-02-05
相关资源
最近更新 更多