Ruby 在 Rails 将 rails 项目从 4.1.9 更新到 4.2.0 后 Rake 抛出 "Incorrect table name" 错误

Ruby on Rails Rake throwing "Incorrect table name" error after updating rails project from 4.1.9 to 4.2.0

最近几个月我一直在做一个项目,它最初是在 4.1.6 中开发的,现在我正在尝试将它更新到 4.2.0(我已经逐步测试了 4.1.6 和 4.1.6 之间的所有版本4.2.0,以及所有 4.1.x 版本都没有错误,只有当我转到 4.2.0 时,我才看到我在这里描述的问题。

在这个应用程序中,有很多所有模型共有的共享功能,所以我创建了一个抽象 class,我的所有模型都继承了这个 class。

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

class User < TrackableModel
  ...
end

Gemfile 中唯一的变化是将 gem 'rails', '4.1.6' 更改为 gem 'rails', '4.2.0'

更新过程遵循 HERE 使用 rake rails:update 的说明,并按照同一文档第 2 部分中的升级步骤进行跟进。

我用这个 rake 任务的默认值覆盖了所有冲突文件,但之后检查了每个文件并进行了修改。

更新前,所有测试都通过,但更新后

130 runs, 0 assertions, 0 failures, 130 errors, 0 skips

有错误

ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect table name '': SHOW FULL FIELDS FROM ``

Error:
xxxTest#test_yyy:
NoMethodError: undefined method `each' for nil:NilClass

该应用程序似乎可以在用户体验没有任何变化的情况下运行。在我尝试执行测试之前,一切看起来都很好。

我无法让我的测试达到 运行。

更新:

我忘了说我是运行宁

ruby 2.1.5p273 (2014-11-13 revision 48405) [i386-mingw32].

此外,我一直在努力遵循执行路径。它在尝试设置固定装置时似乎失败了。它正在经历一个循环,在该循环中构建 table 的 schema_cache。它查询 schema_migrations 和我的第一个自定义 table "customers"(在此调用期间,它遍历此 table 上的每一列,这似乎是成功的)。

下次调用

ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.columns(table_name#String) 

table_name的值为零

不幸的是,我对 ruby/rails 还很陌生,所以我很难找到 table_name 值(schema_migrations、客户、nil、...)的实际设置位置.

有人可以帮助指出 table 列表的来源是构建 schema_cache 吗?

我遇到了同样的问题并且能够解决它。在我的例子中,从 ActiveRecord 继承的基础 class 包括一个 belongs_to :foo 语句。我把它移到了基础 class 的子 classes 并加载了固定装置。

所以,这里有一个例子:

class BaseAwesomeModel < ActiveRecord::Base
    self.abstract_class = true

    # This is what was causing the issue, moved to subclasses
    # belongs_to :something 
end

class AnotherModel < BaseAwesomeModel
    belongs_to :something
end

class YetAnotherModel < BaseAwesomeModel
    belongs_to :something
end

我不确定这是否是导致您的设备无法加载的原因,但这是我的问题的根源。

祝你好运!

仅供遇到此问题且未在基础(摘要)中定义关系的任何其他人注意 class:

范围也可能导致摘要 classes 出现此问题(与 belongs_to 对先前回答者所做的相同),但显然如果您将它们移动到 class工作方法:

变化:

scope :scope_name, -> { #code }

收件人:

def self.scope_name
  #code
end

我的问题实际上是由完全不同的原因引起的。我之前使用的是 foreigner gem,它的定义在迁移中看起来像这样:

change_table :table_name do |t|
  t.remove_foreign_key :column_name
end

如果您将它们移至新的内部化 rails 外键语法,它会起作用:

remove_foreign_key :table_name, :column_name