Pregunta

Tengo una secuencia de migraciones en una aplicación Rails que incluye los siguientes pasos:

  1. Crear una versión básica del modelo 'usuario'
  2. Cree una instancia de este modelo: debe haber al menos un usuario inicial en mi sistema para que pueda iniciar sesión y comenzar a usarlo.
  3. Actualice el modelo de 'usuario' para agregar un nuevo campo/columna.

Ahora estoy usando "validates_inclusion_of" en este nuevo campo/columna.Esto funcionó bien en mi máquina de desarrollo inicial, que ya tenía una base de datos con estas migraciones aplicadas.Sin embargo, si voy a una máquina nueva y ejecuto todas las migraciones, el paso 2 falla, porque valida_inclusión_of falla, porque el campo de la migración 3 aún no se ha agregado a la clase de modelo.

Como solución alternativa, puedo comentar la línea "validates_...", ejecutar las migraciones y descomentarla, pero eso no es bueno.

Mejor sería reordenar mis migraciones para que la creación del usuario (paso 2) sea la última, después de que se hayan agregado todas las columnas.

Soy un novato en Rails, así que pensé en preguntar cuál es la forma preferida de manejar esta situación :)

¿Fue útil?

Solución

La forma más sencilla de evitar este problema es utilizar rake db:schema:load en la segunda máquina, en lugar de db:migrate.D:S:L usa esquema.rb para cargar la versión más actual de su esquema, en lugar de migrarlo desde cero.

Si se encuentra con este problema al implementar en una máquina de producción (donde es importante preservar los datos), probablemente tendrá que consolidar sus migraciones en un solo archivo sin conflictos.

Otros consejos

Puede declarar una clase con el mismo nombre dentro de la migración, anulará la de su aplicación/modelos:

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

  def self.up
    # User.create(:name => 'admin')
  end

end

Desafortunadamente, su IDE puede intentar autocompletarse en función de esta clase (Netbeans lo hace) y no puede usar la lógica de su modelo allí (excepto si la duplica).

Tengo que hacer esto ahora mismo.Siguiendo el consejo de BiHi, estoy cargando el modelo manualmente y luego redefiniendo los métodos donde sea necesario.

load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
  def before_validation; nil; end # clear out the breaking before_validation
  def column1; "hello"; end       # satisfy validates_inclusion_of :column1
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top