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'

アップデート プロセスは、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 を構築しているテーブルのリストがどこから来ているのか、誰かが指摘するのを助けることができますか?

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 に答える