2012-05-23 16 views
5

Ho riscontrato un problema con l'esecuzione delle mie migrazioni in una nuova app per i binari (3.2.3). Stiamo usando postrgres 9.1.3 e - pg (0.13.2) -Gli ambiti del modello stanno rompendo il rake db: migrate - rails 3.2.3 postgres 9.1.3

Quando eseguo rake db: creare, quindi rake db: migrate, ottengo ->

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 

ottengo questo anche senza alcuna migrazione definita, quindi non credo che sia un problema con le migrazioni stesse. Quando guardo lo stack trace, vedo che gli ambiti definiti nel mio modello User sono in esecuzione - quando li commento, le migrazioni vengono eseguite senza problemi.

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

Si tratta di un errore nei binari o sto facendo qualcosa di sbagliato? Apprezzerei molto l'aiuto: possiamo rimuovere l'uso di questi ambiti attraverso l'app, ma questo è qualcosa che vorremmo evitare.

Devo inserire questi ambiti all'interno di una sorta di condizionale che viene richiamato quando le guide vengono caricate nella console o come server ma non durante le migrazioni?

Grazie mille,

Dan Sowter

+0

Sembra che la tabella dei ruoli non sia stata creata nel db: create. Esiste una migrazione per il ruolo? Stai usando un plugin di ruolo come acl9 o role_requirement? Se è così, assicurati di non perdere un generatore che deve essere eseguito. –

+4

Si potrebbe anche voler provare a racchiudere gli ambiti causando problemi in una lamda in modo che non vengano valutati fino a quando non vengono effettivamente utilizzati. –

risposta

16

ho avuto esattamente lo stesso problema. Dopo 2 ore di debugging e di rimozione dei miei capelli, questo benedetto essere umano chiamato Carl Zulauf ha pubblicato la risposta nei commenti.

Il problema è che gli ambiti vengono valutati quando eseguiamo le migrazioni, quindi qualsiasi dipendenza con un'altra tabella che non è stata ancora migrata provocherà quell'errore.

Basta avvolgere tutti gli ambiti con lambda. Ad esempio:

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

Farlo per tutti gli scopi.

Questo dovrebbe fare il trucco. Devono essere pigri valutati (solo quando vengono chiamati), e senza lambda vengono valutati subito.

+2

Grazie mille Nicholas. Scusa se non ho risposto qui prima - la soluzione lambda è esattamente quello che ho fatto, e ha funzionato.Ho provato a racchiudere gli ambiti in qualche modo a meno che Rails.env == non fosse il concetto di "migrazione", ma lambda era il vincitore. –

+0

Grazie mille! :) –

+0

si suppone di utilizzare gli ambiti nelle migrazioni? penserei che sia una cattiva pratica, perché se improvvisamente volessi aggiungere delle modifiche a quell'ambito, ciò potrebbe non necessariamente allinearsi con la precedente migrazione che avevi se avessi rotolato indietro ... (fyi, sono ancora nuovo per le guide se c'è una spiegazione su come trattare con questo) – dtc

3

Se gli ambiti iniziano con find_ come find_by_foo, si interromperanno rake db:migrate. Questo era il bug nel mio caso.

+1

Stavo avendo lo stesso problema, ho cambiato il nome dell'ambito da 'find_by_foo' a' search_by_foo'. – shweta

0

realtà ho avuto lo stesso problema con le migrazioni che hanno causato da ambito predefinito, in questo modo:

default_scope where(deleted: false) 

errore è stato causato da tali blocchi di codice:

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

Questo problema risolto tramite unscoping:

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