Domanda

Ho un compito rastrello che popola alcuni dati iniziali nella mia applicazione Rails. Per esempio, i paesi, stati, operatori di telefonia mobile, ecc.

Il modo in cui ho impostato adesso, è che ho un po 'di creare dichiarazioni nel file in / db / infissi e un compito rastrello che li elabora. Per esempio, un modello che ho è temi. Ho un file theme.rb in / db / infissi che assomiglia a questo:

Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
                      :component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
                      :cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
                      :component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
                      :join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
                      :component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"

L'idea qui è che voglio installare alcuni temi stock per gli utenti di iniziare con. Ho un problema con questo metodo.

Impostazione della ID non funziona. Ciò significa che se decido di aggiungere un tema, chiamiamolo 'Red', quindi vorrei semplicemente per aggiungere l'istruzione tema di questo file fixture e chiamare il compito rastrello per reseed il database. Se lo faccio, perché i temi appartengono ad altri oggetti e il cambiamento del proprio documento di identità questa ri-inizializzazione, tutti i link sono rotti.

La mia domanda è prima di tutto, questo è un buon modo per gestire la semina di un database? In un post precedente, questo mi è stato consigliato.

Se sì, come posso codificare gli ID, e ci sono dei lati negativi di questo?

Se no, qual è il modo migliore per seminare il database?

Io veramente apprezzare lungo e pensato le risposte che incorporano le migliori pratiche.

È stato utile?

Soluzione

Aggiornamento dal momento che queste risposte sono un po 'datato (anche se alcuni si applicano ancora).

funzione semplice aggiunta nel rotaie 2.3.4, db / seeds.rb

Fornisce una nuova attività di rake

rake db:seed

Per la compilazione di record statici comuni, come gli stati, paesi, ecc ...

http://railscasts.com/episodes/179-seed-data

* Nota che è possibile utilizzare dispositivi se si fosse già li ha creati per popolare anche con il db: compito seme mettendo il seguente nel file seeds.rb (dall'episodio Railscast):

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")

Per Rails uso 3.x 'ActiveRecord :: Infissi' invece di 'Fixtures' costante

require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")

Altri suggerimenti

Di solito ci sono 2 tipi di dati semi richiesti.

  • Dati di base su cui il nucleo della vostra applicazione può contare. Io chiamo questo i semi comuni.
  • Dati ambientali , per esempio per sviluppare l'applicazione è utile per avere un po 'di dati in uno stato noto che ci possiamo usare per lavorare su App localmente (la risposta Factory Girl sopra copre questo tipo di dati).

Nella mia esperienza mi ha sempre venire attraverso la necessità di questi due tipi di dati. Così ho messo insieme una piccola perla che si estende semi Rails' e permette di aggiungere più file seme comune sotto db / semi / e tutti i dati di semi ambientale sotto db / semi / ENV per esempio db / semi / sviluppo.

Ho trovato questo approccio è abbastanza per dare i miei dati di semi certa struttura e mi dà il potere di impostare il mio ambiente di sviluppo o messa in scena in uno stato conosciuto semplicemente eseguendo:

rake db:setup

Fixtures sono fragili e flakey di mantenere, come lo sono discariche SQL regolari.

factory_bot suona come che farà ciò che si sta cercando di ottenere. È possibile definire tutti gli attributi comuni nella definizione di default e poi ignorare al momento della creazione. È inoltre possibile passare un id alla fabbrica:

Factory.define :theme do |t|
  t.background_color '0x000000'
  t.title_text_color '0x000000',
  t.component_theme_color '0x000000'
  t.carrier_select_color '0x000000'
  t.label_text_color '0x000000',
  t.join_upper_gradient '0x000000'
  t.join_lower_gradient '0x000000'
  t.join_text_color '0x000000',
  t.cancel_link_color '0x000000'
  t.border_color '0x000000'
  t.carrier_text_color '0x000000'
  t.public true
end

Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5')
Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5')
Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC')

Quando viene utilizzato con falsario può compilare una banca dati molto velocemente con le associazioni senza dover pasticciare con Fixtures (sigh).

Ho codice come questo in un compito rastrello.

100.times do
    Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end

Uso di file seeds.rb o FactoryBot è grande, ma questi sono, rispettivamente, l'ideale per strutture di dati fisse e test.

Il seedbank gemma potrebbe dare un maggiore controllo e modularità per i vostri semi. Inserisce attività rastrello e si può anche definire le dipendenze tra i vostri semi. L'elenco delle attività rake avrà queste aggiunte (ad es.):

rake db:seed                    # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env.
rake db:seed:bar                # Load the seed data from db/seeds/bar.seeds.rb
rake db:seed:common             # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb.
rake db:seed:development        # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb.
rake db:seed:development:users  # Load the seed data from db/seeds/development/users.seeds.rb
rake db:seed:foo                # Load the seed data from db/seeds/foo.seeds.rb
rake db:seed:original           # Load the seed data from db/seeds.rb

Rails è dotato di un modo per seminare i dati come spiegato qui .

Un altro modo sarebbe quello di utilizzare un gioiello per la semina più avanzato o facile come ad esempio:. seedbank

Il principale vantaggio di questo gioiello e il motivo lo uso è che dispone di funzionalità avanzate come ad esempio le dipendenze caricamento dei dati e per i dati di semi d'ambiente.

L'aggiunta di un aggiornato risposta come questa risposta è stato il primo su google.

Aggiungilo a migrazioni di database, in questo modo ognuno ottiene come aggiornano. Maneggiare tutta la tua logica nel codice Ruby / rotaie, in modo da non dover modificare le impostazioni ID esplicite.

Il modo migliore è quello di utilizzare apparecchi.

Nota:. Tenete a mente che fanno infissi inserti diretti e non utilizzare il modello in modo se si dispone di callback che popolano dati che sarà necessario trovare una soluzione

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