Rails 5-PG :: UndefinedTable:错误:关系“ application_records”不存在

pan*_*kka 6 postgresql devise ruby-on-rails-5

我正在尝试使用postgresql 设置新的 Rails 5应用程序(红宝石2.3.1,rails 5.0.0.rc1),设计gems,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' 
Run Code Online (Sandbox Code Playgroud)

经过大量的搜索之后,我意识到这与Rails 5中ApplicationRecord基类的更改有关。显然没有调用任何表application_records,因此active_support不应查找该表。我已经检查过该app/models/application_record.rb内容并具有正确的内容。此外,用户模型(这是当前我的应用程序中唯一的模型)按预期扩展了ApplicationRecord:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, 
         :recoverable, :rememberable, :trackable, :validatable
end
Run Code Online (Sandbox Code Playgroud)

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

谁能弄清楚是什么原因造成的?

内容application_record.rb:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
Run Code Online (Sandbox Code Playgroud)

agb*_*ike 7

这

PG::UndefinedTable: ERROR:  relation "application_records" does not exist
Run Code Online (Sandbox Code Playgroud)

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

self.abstract_class = true
Run Code Online (Sandbox Code Playgroud)

从app/models/application_record.rb

该行让 Rails 知道这不是一个应该持久保存到数据库的模型,这里有一个关于 Rails 抽象类的很好的总结: https: //medium.com/@jeremy_96642/deep-rails-how-to-使用抽象类-6aee9b686e75


pan*_*kka 3

回答我自己的问题,因此可能会帮助其他遇到类似问题的人。

正如 @PrathameshSonpatki 在Rails 问题上提到的,发生这种情况是因为userstamp gem注入关系ActiveRecord::Base而不是ApplicationRecord. (请注意,在撰写本文时,userstamp gem 与 Rails 5 不兼容)。

如果您有一个 gem 尚未使用 Rails 5 进行测试,并且您遇到了 active_support 寻找名为 的表的问题application_records,请检查您正在使用的 gem 之一是否注入了类上的关系ActiveRecord::Base。根据这篇博文,其目的ApplicationRecord就是避免全局注入ActiveRecord::Base。因此,您需要寻找与 Rails 5 兼容的此类 gem 的版本,或修补此类 gem 以将必要的行为注入ApplicaitonRecord而不是ActiveRecord::Base.

  • 我想知道追踪破坏我们应用程序的 gem 的最佳方法是什么。我们有几百个,但 userstamp 不在那里。 (2认同)