2012-05-23 12 views
5

Me he encontrado con un problema al ejecutar mis migraciones en una nueva aplicación Rails (3.2.3). Estamos utilizando postrgres 9.1.3 y - pg (0.13.2) -Los ámbitos del modelo están rompiendo rake db: migrate-rails 3.2.3 postgres 9.1.3

Cuando corro rake db: crear, a continuación, el rastrillo db: migrate, consigo ->

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 

consigo esto, incluso sin ninguna migración definida, así que no creo que sea un problema con las migraciones en sí. Cuando miro el seguimiento de la pila, veo que se están ejecutando los ámbitos definidos en mi modelo de usuario: cuando los comente, las migraciones se ejecutarán sin problemas.

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

¿Esto es un error en los rieles, o estoy haciendo algo mal? Realmente agradecería algo de ayuda: podemos eliminar el uso de estos ámbitos en la aplicación, pero esto es algo que queremos evitar.

¿Debería poner estos ámbitos dentro de un tipo de condición que se llama cuando los carriles se cargan en la consola o como servidor pero no durante las migraciones?

Muchas gracias,

Dan Sowter

+0

Parece que la tabla de roles no se creó en db: create. ¿Hay una migración para Role? ¿Estás usando un complemento de función como acl9 o role_requirement? Si es así, asegúrese de no perder un generador que deba ejecutarse. –

+4

Es posible que también desee intentar envolver los ámbitos causando problemas en un lamda para que no se evalúen hasta que realmente se utilicen. –

Respuesta

16

que estaba teniendo exactamente el mismo problema. Después de 2 horas depurando y quitándome el pelo, este bendito ser humano llamado Carl Zulauf publicó la respuesta en los comentarios.

El problema es que los ámbitos se están evaluando cuando ejecutamos las migraciones, por lo que cualquier dependencia con otra tabla que aún no se haya migrado generará ese error.

Simplemente ajuste todos sus ámbitos con lambda. Por ejemplo:

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

Haga eso para todos los ámbitos.

Eso debería hacer el truco. Deben ser evaluados vagamente (justo cuando se les llama), y sin lambda se están evaluando de inmediato.

+2

Muchas gracias Nicholas. Lamento no haber respondido aquí antes: la solución lambda es exactamente lo que hice, y funcionó.Traté de envolver los ámbitos en algún tipo de concepto a menos que Rails.env == 'migration', pero lambda fue el ganador. –

+0

¡Muchas gracias! :) –

+0

¿Se supone que debes usar ámbitos en las migraciones? Creo que es una mala práctica, porque si de repente quisieras agregar cambios a ese alcance, eso podría no alinearse necesariamente con la migración anterior que tenías si revirtieras ... (fyi, todavía soy nuevo en los rieles si hay una explicación sobre cómo tratar con esto) – dtc

3

Si sus ámbitos comienzan con find_ como find_by_foo, entonces se romperán rake db:migrate. Ese fue el error en mi caso.

+1

Estaba teniendo el mismo problema, cambié el nombre del ámbito de 'find_by_foo' a' search_by_foo'. – shweta

0

realidad tenía mismo problema con las migraciones que causaran por ámbito predeterminado, como esto:

default_scope where(deleted: false) 

error fue causado por dichos bloques de código:

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

resolver este problema a través de unscoping:

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