2012-01-27 5 views
1

これは非常に私と一緒にクマ複雑な例ですがスコープその後、再シードします。いくつかの場所でトリガを使用しているため、rake db:RAILS_ENV = testをマイグレートしてテストデータベースを適切に移行する必要がありました。エラー(名前付き)を持つクラスをキャッシュ

私のテスト環境でconfig.cache_classes = trueを有効にするまでは問題ありません。空のデータベース上でレーキの移行が実行されたとき、テーブルがどのように存在しないかについてのエラーが発生します。

scope :find_by_route_and_date, lambda { |route_id, date| 
    { 
     :conditions=>{:route_id=>route_id, :schedule_date=>date} 
    } 
    } 

、スコープがラムダであり、それが評価取得されるべきではなく:--traceでこれを実行すると、私はそれが基本的なスコープを宣言するときにその私のオブジェクトのいずれかに爆破することを見つけますcache_classesを削除すると、移行は正常に動作します。だから私には、モデルがキャッシュされているように思えます。テーブルがまだ存在しないために範囲を絞ってしまい、移行を開始することができません。

私は迷っていますか?他に誰もこれを見た?私のデータベースを拭く必要がある場合は、キャッシングをオフにしてからマイグレートし、再度オンにする必要がありますか?

のRails 3.2、ルビー1.9.2、熊手UPDATED 0.9.2.2

を要求したように、ここでのスタックトレースは次のとおりです。https://gist.github.com/1705064

order.rb:179であります私の最初のスコープが定義されている場所と、上記にリストアップされた場所が爆発する場所。

+0

スタックトレースは何ですか? – phoet

+0

要点にトレースへのリンクを含めるように編集しました –

+0

'order_controller.rb'がスタックに入っているのがちょっと奇妙です。実際にスコープを呼び出すレイクタスクでいくつかクレイジーなことをしていないことを確認してください。 – phoet

答えて

2

これは興味深いことです。スタックトレースを読んだことは、既存のメソッドを上書きすることによって問題が生じているかどうかを、そのスコープを作成する(つまり、同じ名前のメソッドを作成する)かどうかを確認する手助けをしようとしていることです。

これはアクティブレコードの下にrespond_toのスコープ/メソッド名がダイナミックファインダーのように見えると考えています。それから、さらに進んでいきます。ダイナミックファインダのように見えるだけでなく、名前付き属性はすべて存在しますか?これは、存在しないテーブルが持つカラムをチェックして、すべてが爆発することを試みます。

あなたできた(と思う)いくつかのいずれかを実行します。

範囲の前に
  • 、スコープと同じ名前のクラスメソッドを定義するrespond_toコール(不潔)短絡するように
  • は、私はまだわからない valid_scope_name

スコープ名

  • オーバーライドを変更
  • なぜできないのセットアップスキーマファイルからテストデシベル、にスキーマダンパーを設定し、必要に応じてアクティブレコードがネイティブにサポートしていないものは保存されるようにです。

  • +0

    あなたは死んでいました。私はスコープをFinderのように見えないように改名し、移行はうまくいった。私はsqlダンパーを見てみましょう、それは私のトリガーのためのより良い解決策になります。ありがとう! –

    0

    通常、マイグレーションでモデルを参照することは、さまざまな理由から行うべきではありません。最も顕著なのは、モデルが最初にインスタンス化されるときに、テーブル構造に関する多くの情報がキャッシュされることです。 2番目に重要な問題は、リファクタリングされている場合、モデルファイルが将来のバージョンのアプリケーションにも存在しないことです。

    ベストプラクティスは、app/modelsディレクトリの状態に関係なく機能する、より低レベルのデータ操作方法を常に使用することです。優れた移行スイートは、欠落しているファイルや方法に煩わされることなく、元の状態から最新のバージョンに構築できます。これが自己完結型が重要である理由です。

    おそらく、executeで実行できるよりリテラルなものとしてこのスコープを書き換えることができます。

    testトリガーを使用していて、スキーマダンパーが正しく記録していないために問題が発生した場合は、代わりに:sql形式を使用してください。よりリテラルなコピーであり、Ruby化された形式の制限の影響を受けてはいけません。

    +0

    マイグレーションはモデルを参照していません。これは、移行がまったくスピンアップする前に起こっています。 –

    +1

    私が収集したものから、モデルはマイグレーションに使用されていません(危険だと私は同意しますが) –

    +0

    それは奇妙です。あなたが修正を持っているように見える! – tadman

    関連する問題