Ruby on Rails Rake在将rails项目从4.1.9更新到4.2.0后抛出“不正确的表名”错误

问题描述 投票:2回答:2

我在过去几个月一直致力于一个项目,最初是在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'

更新过程遵循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].

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

在接下来的电话中

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

table_name的价值是零

不幸的是,我仍然足够新的ruby / rails我很难找到table_name值(schema_migrations,customers,nil,...)实际设置的位置。

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

ruby-on-rails-4 upgrade rake-test
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

我不确定这是否是导致你的灯具无法加载的原因,但这是我的问题的根源。

祝好运!


0
投票

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

范围也可能导致抽象类的这个问题(就像belongs_to为之前的回答者所做的那样),但显然如果你将它们移动到类方法它可以工作:

更改:

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
© www.soinside.com 2019 - 2024. All rights reserved.