2012-05-23 4 views
5

Ich habe ein Problem mit dem Ausführen meiner Migrationen in einer neuen Rails App (3.2.3). Wir verwenden postrgres 9.1.3 und - pg (0.13.2) -Modellbereiche brechen Rake db: migrate - rails 3.2.3 postgres 9.1.3

Wenn ich rake db ausführen: Erstellen, dann db Rake: wandern, ich ->

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 

ich das bekommen auch ohne irgendwelche Migrationen definiert zu haben, also glaube ich nicht, dass es ein Problem mit den Migrationen selbst ist. Wenn ich mir den Stack-Trace anschaue, sehe ich, dass Bereiche, die in meinem Benutzermodell definiert sind, ausgeführt werden. Wenn ich sie auszeichne, laufen die Migrationen problemlos.

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

Ist das ein Fehler in den Schienen, oder mache ich etwas falsch? Ich würde wirklich etwas Hilfe zu schätzen wissen - wir können die Verwendung dieser Bereiche in der App entfernen, aber das möchten wir vermeiden.

Sollte ich diese Bereiche in eine Art von Bedingung setzen, die aufgerufen wird, wenn Schienen in der Konsole oder als Server geladen wird, aber nicht während Migrationen? sehr viel

Danke,

Dan Sowter

+0

Sieht aus, als ob die Rollentabelle nicht in der db: create erstellt wurde. Gibt es eine Migration für Role? Verwenden Sie ein Rollen-Plugin wie acl9 oder role_requirement? Wenn ja, vergewissern Sie sich, dass Ihnen kein Generator fehlt, der ausgeführt werden muss. –

+4

Sie können auch versuchen, die Bereiche, die Probleme in einer Lamda verursachen, zu umhüllen, damit sie erst ausgewertet werden, wenn sie tatsächlich verwendet werden. –

Antwort

16

Ich hatte genau das gleiche Problem. Nach 2 Stunden Debugging und ziehen meine Haare aus, dieser gesegnete Mensch namens Carl Zulauf veröffentlichte die Antwort in den Kommentaren.

Das Problem ist, dass die Gültigkeitsbereiche ausgewertet werden, wenn wir die Migrationen ausführen. Daher wird jede Abhängigkeit mit einer anderen Tabelle, die noch nicht migriert wurde, zu diesem Fehler führen.

Umwickeln Sie einfach alle Ihre Bereiche mit Lambda. Zum Beispiel:

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

Tun Sie das für alle Bereiche.

Das sollte den Trick tun. Sie müssen faul ausgewertet werden (nur wenn sie angerufen werden), und ohne lambda werden sie sofort ausgewertet.

+2

Vielen Dank Nicholas. Entschuldigung, ich habe hier nicht früher geantwortet - die Lambda-Lösung ist genau das, was ich getan habe, und es hat funktioniert.Ich habe versucht, die Bereiche in eine Art zu verpacken, es sei denn Rails.env == 'Migration' Konzept, aber Lambda war der Gewinner. –

+0

Vielen Dank! :) –

+0

sollen Sie Bereiche in Migrationen verwenden? Ich würde denken, das ist eine schlechte Übung, denn wenn Sie dem Bereich plötzlich Änderungen hinzufügen wollten, würde das nicht unbedingt mit der vorherigen Migration übereinstimmen, wenn Sie zurückgerollt sind. (fyi, ich bin noch neu bei rails, wenn es eine Erklärung dafür gibt) damit umgehen) – dtc

3

Wenn Ihre Bereiche mit find_ wie find_by_foo beginnen, werden sie rake db:migrate brechen. Das war der Fehler in meinem Fall.

+1

Ich hatte das gleiche Problem, ich änderte den Namen des Bereichs von 'find_by_foo' zu' search_by_foo'. – shweta

0

ich eigentlich gleiche Problem mit Migrationen hatte, die durch Standardbereich verursacht, wie folgt aus:

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

Dieses Problem über unscoping gelöst:

default_scope where(deleted: false) 

Fehler durch solche Codeblöcke verursacht wurde

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