5

新しい Rails アプリ (3.2.3) で移行を実行する際に問題が発生しました。postrgres 9.1.3 と - pg (0.13.2) - を使用しています。

rake db:create を実行してから rake db:migrate を実行すると、->

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))

これはレールのバグですか、それとも何か間違っていますか? アプリ全体でこれらのスコープの使用を削除することはできますが、これは避けたいことです。

これらのスコープを、レールがコンソールにロードされたとき、またはサーバーとしてロードされたときに呼び出されるが、移行中には呼び出されない何らかの条件内に配置する必要がありますか?

どうもありがとう、

ダン・ソーター

4

3 に答える 3

17

私はまったく同じ問題を抱えていました。2 時間のデバッグと私の髪の脱落の後、 Carl Zulaufと呼ばれるこの祝福された人間がコメントに答えを投稿しました。

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

すべてのスコープをラムダでラップするだけです。例えば:

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

すべてのスコープに対してそれを行います。

これでうまくいくはずです。それらは (呼び出されたときに) 遅延評価する必要があり、すぐに評価されることはありませんlambda

于 2012-05-26T16:52:12.087 に答える
3

find_スコープがlikeで始まる場合、find_by_fooそれらは break になりrake db:migrateます。それが私の場合のバグでした。

于 2012-12-26T11:40:13.147 に答える
0

私は実際に、次のように、デフォルトのスコープによって引き起こされた移行で同じ問題を抱えていました:

default_scope where(deleted: false)

次のようなコード ブロックが原因でエラーが発生しました。

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

この問題は、スコープ解除によって解決されました。

ModelName.unscoped.each_with_index do |m, i|
...
end
于 2013-10-10T13:19:53.307 に答える