Rails 5 - PG::UndefinedTable: ERROR: relation "application_records" does not exist Rails 5 - PG::UndefinedTable:错误:关系“application_records”不存在。

7

我正在尝试建立一个新的Rails 5应用程序(ruby 2.3.1,rails 5.0.0.rc1),使用postgresql、devise宝石,并且由于以下错误导致无法运行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' 

经过大量的搜索,我意识到这与 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

"

rails db: migrate 命令可以正常运行,但是 rails db:seed 命令出现了上述错误。

有人能够解释一下可能是什么原因导致这个问题吗?

application_record.rb 文件的内容如下:

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

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

7

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

3

回答自己的问题,以便帮助遇到类似问题的其他人。

正如@PrathameshSonpatki在rails问题中所提到的那样,这是因为userstamp gem将关系注入了ActiveRecord::Base而不是ApplicationRecord。(请注意,此时的userstamp gem不兼容Rails 5)。

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


2
我想知道追踪破坏我们应用程序的 gem 的最佳方法是什么。我们有几百个 gem,但没有 userstamp。 - lzap
@Izap 我有一个叫做 gem_bench 的宝石,它允许你在项目中捆绑的所有宝石的源代码中进行 grep,这样你就可以查找类似的东西。https://github.com/pboling/gem_bench - Peter H. Boling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接