Domanda

Ho un'applicazione ferroviaria in cui gli utenti devono accedere.Pertanto, affinché l'applicazione sia utilizzabile, è necessario che nel sistema sia presente un utente iniziale con cui la prima persona possa accedere (potrà quindi creare gli utenti successivi).Finora ho utilizzato una migrazione per aggiungere un utente speciale al database.

Dopo aver chiesto questa domanda, sembra che dovrei utilizzare db:schema:load, anziché eseguire le migrazioni, per impostare nuovi database su nuove macchine di sviluppo.Sfortunatamente, questo non sembra includere le migrazioni che inseriscono dati, solo quelle che impostano tabelle, chiavi, ecc.

La mia domanda è: qual è il modo migliore per gestire questa situazione:

  1. Esiste un modo per fare in modo che d:s:l includa le migrazioni di inserimento dati?
  2. Non dovrei utilizzare affatto le migrazioni per inserire i dati in questo modo?
  3. Non dovrei precompilare il database con i dati?Devo aggiornare il codice dell'applicazione in modo che gestisca il caso in cui non ci sono utenti e consenta la creazione di un account utente iniziale in tempo reale dall'interno dell'applicazione?
  4. Altre opzioni?:)
È stato utile?

Soluzione 7

Ho pensato di riassumere alcune delle ottime risposte che ho avuto a questa domanda, insieme ai miei pensieri ora che le ho lette tutte :)

Ci sono due questioni distinte qui:

  1. Devo precompilare il database con il mio utente speciale "amministratore"?Oppure l'applicazione dovrebbe fornire un modo per configurarla al primo utilizzo?
  2. Come si precompila il database con i dati?Tieni presente che questa è una domanda valida indipendentemente dalla risposta alla parte 1:esistono altri scenari di utilizzo per la precompilazione rispetto a un utente amministratore.

Per (1), sembra che la configurazione del primo utente dall'interno dell'applicazione stessa sia un bel po' di lavoro extra, per funzionalità che, per definizione, non vengono quasi mai utilizzate.Potrebbe essere leggermente più sicuro, tuttavia, poiché obbliga l'utente a impostare una password di sua scelta.La soluzione migliore è tra questi due estremi:avere uno script (o un'attività rake o altro) per configurare l'utente iniziale.Lo script può quindi essere configurato per compilarsi automaticamente con una password predefinita durante lo sviluppo e per richiedere l'immissione di una password durante l'installazione/distribuzione di produzione (se si desidera scoraggiare l'uso di una password predefinita per l'amministratore).

Per (2), sembra che esistano numerose soluzioni buone e valide.Un'attività rake sembra una buona soluzione e ci sono alcuni plugin per renderlo ancora più semplice.Basta guardare alcune delle altre risposte per vederne i dettagli :)

Altri suggerimenti

Prova un compito rake.Per esempio:

  1. Creare il file /lib/tasks/bootstrap.rake
  2. Nel file, aggiungi un'attività per creare il tuo utente predefinito:

    namespace :bootstrap do
      desc "Add the default user"
      task :default_user => :environment do
        User.create( :name => 'default', :password => 'password' )
      end

      desc "Create the default comment"
      task :default_comment => :environment do
        Comment.create( :title => 'Title', :body => 'First post!' )
      end

      desc "Run all bootstrapping tasks"
      task :all => [:default_user, :default_comment]
    end
  1. Quindi, quando configuri la tua app per la prima volta, puoi eseguire rake db:migrate OR rake db:schema:load, quindi eseguire rake bootstrap:all.

Utilizzo db/seed.rb trovato in ogni applicazione Rails.

Mentre alcune risposte fornite sopra da 2008 possono funzionare bene, sono piuttosto obsoleti e non sono più una vera e propria convenzione di Rails.

Dovrebbe essere completato il popolamento dei dati iniziali nel database db/seed.rb file.

Funziona proprio come un file Ruby.

Per creare e salvare un oggetto, puoi fare qualcosa del tipo:

User.create(:username => "moot", :description => "king of /b/")

Una volta che hai questo file pronto, puoi procedere come segue

rake db:migrate

rake db:seed

O in un solo passaggio

rake db:setup

Il tuo database dovrebbe essere popolato con qualsiasi oggetto tu voglia creare in seed.rb

Ti consiglio di non inserirne nessuno nuovo dati nelle migrazioni.Modifica invece solo i dati esistenti nelle migrazioni.

Per inserire i dati iniziali, ti consiglio di utilizzare YML.In ogni progetto Rails che configuro, creo una directory fixture nella directory DB.Quindi creo file YML per i dati iniziali proprio come i file YML vengono utilizzati per i dati di test.Quindi aggiungo una nuova attività per caricare i dati dai file YML.

lib/tasks/db.rake:

namespace :db do
  desc "This loads the development data."
  task :seed => :environment do
    require 'active_record/fixtures'
    Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|
      base_name = File.basename(file, '.*')
      say "Loading #{base_name}..."
      Fixtures.create_fixtures('db/fixtures', base_name)
    end
  end

  desc "This drops the db, builds the db, and seeds the data."
  task :reseed => [:environment, 'db:reset', 'db:seed']
end

db/fixtures/users.yml:

test:
  customer_id: 1
  name: "Test Guy"
  email: "test@example.com"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"

Questa è la mia nuova soluzione preferita, utilizzando il populator e le gemme false:

http://railscasts.com/episodes/126-popuring-a-database

Prova il seme-fu plugin, che è un plugin abbastanza semplice che ti consente di seminare dati (e modificarli in futuro), ti consentirà anche di seminare dati specifici dell'ambiente e dati per tutti gli ambienti.

Immagino che l'opzione migliore sia la numero 3, principalmente perché in questo modo non ci sarà alcun utente predefinito, il che è un ottimo modo per rendere inutile una sicurezza altrimenti buona.

Prendi in considerazione l'utilizzo della console dei binari.Utile per attività amministrative una tantum in cui non vale la pena impostare uno script o una migrazione.

Sulla tua macchina di produzione:

script/console production

...Poi ...

User.create(:name => "Whoever", :password => "whichever")

Se stai generando questo utente iniziale più di una volta, potresti anche aggiungere uno script in RAILS_ROOT/script/ ed eseguirlo dalla riga di comando sulla tua macchina di produzione o tramite un'attività capistrano.

L'attività Rake può essere fornita dal plugin db-populate:

http://github.com/joshknowles/db-populate/tree/master

Ottimo post sul blog su questo:http://railspikes.com/2008/2/1/loading-seed-data

Stavo utilizzando i suggerimenti di Jay su un set speciale di dispositivi, ma mi sono subito ritrovato a creare dati che non sarebbero stati possibili utilizzando direttamente i modelli (voci senza versione quando utilizzavo act_as_versioned)

Lo terrei in una migrazione.Anche se è consigliabile utilizzare lo schema per le configurazioni iniziali, il motivo è che è più veloce ed evita problemi.Una singola migrazione aggiuntiva per i dati dovrebbe andare bene.

Potresti anche aggiungere i dati nel file di schema, poiché è lo stesso formato delle migrazioni.Perderesti semplicemente la funzione di generazione automatica.

Per utenti e gruppi, la questione degli utenti preesistenti dovrebbe essere definita rispetto alle esigenze dell'applicazione piuttosto che alle contingenze della programmazione.Forse la tua app richiede un amministratore;quindi precompilare.O forse no, quindi aggiungi il codice per richiedere con garbo la configurazione dell'utente al momento del lancio dell'applicazione.

Sulla questione più generale, è chiaro che molte app Rails possono trarre vantaggio dalla data precompilata.Ad esempio, una richiesta di detenzione di un indirizzo statunitense può anche contenere tutti gli Stati e le relative abbreviazioni.In questi casi le migrazioni sono tue amiche, credo.

Alcune risposte sono obsolete.A partire da Rails 2.3.4, è disponibile una semplice funzionalità chiamata Seed db/seed.rb :

#db/seed.rb
User.create( :name => 'default', :password => 'password' )
Comment.create( :title => 'Title', :body => 'First post!' )

Fornisce una nuova attività rake che puoi utilizzare dopo le migrazioni per caricare i dati:

rake db:seed

Seed.rb è un classico file Ruby, sentiti libero di utilizzare qualsiasi struttura dati classica (array, hash, ecc.) e iteratori per aggiungere i tuoi dati:

["bryan", "bill", "tom"].each do |name|
  User.create(:name => name, :password => "password")
end

Se desideri aggiungere dati con caratteri UTF-8 (molto comuni in francese, spagnolo, tedesco, ecc.), non dimenticare di aggiungere all'inizio del file:

# ruby encoding: utf-8

Questo Railscast è una buona introduzione: http://railscasts.com/episodes/179-seed-data

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top