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
最近几个月我一直在做一个项目,它最初是在 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