2012-05-23 7 views
5

新しいレールアプリ(3.2.3)でマイグレーションを実行する際に問題が発生しました。 PG(0.13.2) - - 私たちは、postrgres 9.1.3を使用している私がすくいデシベルを実行するとモデルスコープが壊れているrake db:migrate - rails 3.2.3 postgres 9.1.3

を:作成し、その後、DB熊手: - >

1.9.3-p194 (master) rake db:migrate --trace 
** Invoke db:migrate (first_time) 
** Invoke environment (first_time) 
** Execute environment 
rake aborted! 
PG::Error: ERROR: relation "roles" does not exist 
LINE 4:    WHERE a.attrelid = '"roles"'::regclass 
            ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull 
      FROM pg_attribute a LEFT JOIN pg_attrdef d 
      ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
     WHERE a.attrelid = '"roles"'::regclass 
      AND a.attnum > 0 AND NOT a.attisdropped 
     ORDER BY a.attnum 

私もこれを取得移行し、私が取得します移行が定義されていないため、移行自体に問題はないとは思いません。スタックトレースを見ると、Userモデルで定義されたスコープが実行されていることがわかります。私がコメントアウトすると、問題なく移行が実行されます。

scope :team_leaders, where(role_id: Role.where(name: 'Team Leader').first.try(:id)) 
scope :area_leaders, where(role_id: Role.where(name: 'Area Leader').first.try(:id)) 
scope :nation_leaders, where(role_id: Role.where(name: 'Nation Leader').first.try(:id)) 
scope :employees, where(role_id: Role.where(name: 'Employee').first.try(:id)) 

これはレールのバグですか、間違っていますか?私は本当にいくつかの助けに感謝します - 私たちはアプリ全体でこれらのスコープの使用を削除することができますが、これは避けたいものです。

これらのスコープは、コンソールに、またはサーバーとしてレールがロードされているが、マイグレーション中にロードされていないときに呼び出す必要がありますか?私は正確に同じ問題を抱えていた

おかげで非常に多く、

ダンSowter

+0

db:createにロールテーブルが作成されていないように見えます。役割の移行はありますか? acl9やrole_requirementのようなロールプラグインを使用していますか?その場合は、実行する必要のある発電機がないことを確認してください。 –

+4

スコープをラッピングしてラムダで問題が発生するようにして、実際に使用されるまで評価されないようにすることもできます。 –

答えて

16

。 2時間のデバッグと私の髪の毛を引っ張った後、この祝福された人間はという名前のCarl Zulaufと答えました。

問題は、移行を実行するときにスコープが評価されているため、まだ移行されていない別のテーブルとの依存関係でエラーが発生することです。

すべてのスコープをラムダで囲むだけです。たとえば、

scope :team_leaders, lambda { where(role_id: Role.where(name: 'Team Leader').first.try(:id)) } 

これはすべてのスコープで行います。

これはすべきことです。彼らは怠惰な評価を受ける必要があります(ちょうど呼び出されるとき)、そしてlambdaなしで、彼らはすぐに評価されています。

+2

ありがとう、ニコラス。申し訳ありませんが、私は早くここに返信しませんでした。ラムダの解決策はまさに私がやったことです。Rails.env == 'migration'コンセプトでない限り、スコープを何らかの形でラップしようとしましたが、ラムダが勝者でした。 –

+0

ありがとう! :) –

+0

あなたは移行でスコープを使用する予定ですか?あなたが突然その範囲に変更を加えることを望んでいた場合、ロールバックした場合の以前の移行と必ずしも一致しないかもしれないので、悪い習慣だと思うでしょう。(fyi、どのようにこれと対処する) – dtc

3

スコープがfind_find_by_foo)の場合は、rake db:migrateが壊れます。 それは私の場合のバグでした。

私は実際にこのように、デフォルトのスコープによって引き起こさマイグレーションと同じ問題を持っていた
+1

私は同じ問題を抱えていました。スコープ名を 'find_by_foo'から' search_by_foo'に変更しました。 – shweta

0

ModelName.all.each_with_index do |m, i| 
... 
end 

この問題はunscoping経由解決:

default_scope where(deleted: false) 

エラーは、コードのようなブロックによって引き起こされた

ModelName.unscoped.each_with_index do |m, i| 
... 
end 
関連する問題