3

过去几个月我一直在研究一个项目,该项目最初是在 4.1.6 中开发的,现在我正在尝试将其更新到 4.2.0(我已经逐步测试了 4.1.6 和 4.2.0 之间的所有版本,并且所有 4.1.x 版本都可以正常工作,只有当我转到 4.2.0 时,我才看到我在此处描述的问题)。

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

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

class User < TrackableModel
  ...
end

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

更新过程遵循此处使用的说明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].

此外,我一直在努力遵循执行路径。它在尝试设置固定装置时似乎失败了。它正在通过一个循环来构建表的 schema_cache。它查询 schema_migrations 和我的第一个自定义表“customers”(在此调用期间,它迭代了该表上似乎成功的每个列)。

在下一次调用

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

table_name的值为 nil

不幸的是,我对 ruby​​/rails 还是很陌生,我很难找到 table_name 值(schema_migrations,customers,nil,...)的实际设置位置。

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

4

2 回答 2

5

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

所以,这里有一个例子:

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

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

祝你好运!

于 2015-01-26T21:09:09.157 回答
0

对于遇到此问题并且没有在基(抽象)类中定义的关系的任何其他人,请注意:

作用域也可能导致抽象类出现此问题(与 belongs_to 对以前的回答者所做的相同),但显然如果将它们移到类方法中它可以工作:

改变:

scope :scope_name, -> { #code }

至:

def self.scope_name
  #code
end

我的问题实际上是由完全不同的东西引起的。我以前使用过foreignergem,它的定义在迁移中看起来像这样:

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

如果将这些移到新的内化 rails 外键语法中,它可以工作:

remove_foreign_key :table_name, :column_name
于 2018-01-12T21:01:10.733 回答