Domanda

Ho una sequenza di migrazioni in un'app Rails che include i seguenti passaggi:

  1. Crea la versione base del modello "utente".
  2. Crea un'istanza di questo modello: è necessario che sia presente almeno un utente iniziale nel mio sistema in modo che tu possa accedere e iniziare a utilizzarlo
  3. Aggiorna il modello 'utente' per aggiungere un nuovo campo/colonna.

Ora sto utilizzando "validates_inclusion_of" su questo nuovo campo/colonna.Ha funzionato bene sulla mia macchina di sviluppo iniziale, che aveva già un database con queste migrazioni applicate.Tuttavia, se utilizzo una nuova macchina ed eseguo tutte le migrazioni, il passaggio 2 fallisce, perché validates_inclusion_of fallisce, perché il campo della migrazione 3 non è stato ancora aggiunto alla classe del modello.

Come soluzione alternativa, posso commentare la riga "validates_...", eseguire le migrazioni e rimuoverla dal commento, ma non è carino.

Sarebbe meglio riordinare le mie migrazioni in modo che la creazione dell'utente (passaggio 2) venga per ultima, dopo che tutte le colonne sono state aggiunte.

Sono però un principiante dei binari, quindi ho pensato di chiedere qual è il modo preferito per gestire questa situazione :)

È stato utile?

Soluzione

Il modo più semplice per evitare questo problema è utilizzare rake db:schema:load sulla seconda macchina, invece di db:migrate.D:S:L utilizza schema.rb per caricare la versione più recente del tuo schema, invece di migrarlo da zero.

Se riscontri questo problema durante la distribuzione su una macchina di produzione (dove la conservazione dei dati è importante), probabilmente dovrai consolidare le tue migrazioni in un singolo file senza conflitti.

Altri suggerimenti

Puoi dichiarare una classe con lo stesso nome all'interno della migrazione, sovrascriverà quella della tua app/modello:

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

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

end

Sfortunatamente, il tuo IDE potrebbe provare a completarsi automaticamente in base a questa classe (Netbeans lo fa) e non puoi utilizzare la logica del tuo modello lì dentro (a meno che non lo duplichi).

Devo farlo proprio adesso.Basandosi sui consigli di BiHi, sto caricando il modello manualmente, quindi ridefinendo i metodi dove necessario.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top