2010-02-26 11 views
11

Sto cercando di salvare alcuni dati della tabella di ricerca in un file YAML in modo che in un secondo momento, quando ho bisogno di configurare la mia app su un altro computer, posso caricare i dati come dati seme.Come posso caricare alcuni modelli ActiveRecord da un file YAML e salvarli nel DB?

I dati sono cose come le opzioni di selezione, ed è praticamente impostato, quindi non preoccuparti dei dati in tempo reale che cambiano tra serializzazione e deserializzazione.

ho l'output dei dati come questo ...

file = File.open("#{RAILS_ROOT}/lib/tasks/questions/questions.yml", 'w') 
questions = Question.find(:all, :order => 'order_position') 
file << YAML::dump(questions) 
file.close() 

E posso caricare il file come questo ...

questions = YAML.load_file('lib/tasks/questions/questions.yml') 

Tuttavia, quando si tenta di salvare una domanda ottengo questo errore ...

>> questions[0].save 
NoMethodError: undefined method `save' for #<YAML::Object:0x2226b84> 

Qual è il modo corretto per farlo?

+0

Quale versione di Rails stai usando? –

+0

Sto usando Rails 2.3.5 – Ethan

risposta

8

ho provato lo scenario e non ho avuto problemi. Ho fatto le seguenti modifiche alla vostra logica di creazione del file YAML:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
File.open(yml_file, 'w') do |file| 
    questions = Question.order(:order_position).to_a 
    YAML::dump(questions, file) 
end 

ero in grado di recuperare l'elenco questions come segue:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
question_attributes_list = YAML.load_file(yml_file).map(&:attributes) 
questions = Question.create(question_attributes_list) 
1

Se si utilizza Rails 2.3.4 (o superiore), hanno un file seeds.rb che può essere trovato nella cartella delle applicazioni db. Questo consente di definire record attivo di base crea, e quando hai impostato il tuo nuovo progetto, si può semplicemente chiamare:

rake db:seed 

C'è un eccellente Railscast su di esso here, e un buon post sul blog su di esso here. Se non utilizzi Rails 2.3.4 (o, idealmente, 2.3.5), consiglio vivamente l'aggiornamento per queste fantastiche funzioni e la sicurezza aggiuntiva/correzioni di errori.

+0

Grazie, sì questa è una grande funzionalità. Voglio memorizzare i dati in un file YAML e caricarli usando 'seeds.rb'. Ci sono abbastanza dati che la codifica hard-key delle istanze del modello direttamente in 'seeds.rb' sarebbe imbarazzante. – Ethan

+0

seeds.rb è solo un file rubino. Puoi caricare YAML all'interno di seeds.rb come descritto qui (http://ruby-doc.org/core/classes/YAML.html), e semplicemente eseguire un ciclo attraverso l'array (s) mentre fai un Model.create(). –

20

Creare un file seed.yml nella directory db. Aggiungi un documento YAML per ogni modello che desideri creare. Questo documento dovrebbe contenere un elenco di hash. Ogni hash dovrebbe contenere gli attributi del modello.

users: 
     - login: jake 
      password: jake123 
      password_confirmation: jake123 
      first_name: Jake 
      last_name: Driver 

     - login: Jane 
      password: jane123 
      password_confirmation: jane123 
      first_name: Jane 
      last_name: McCain 

    categories: 

    products: 

Nel file seed.rb

seed_file = File.join(Rails.root, 'db', 'seed.yml') 
config = YAML::load_file(seed_file) 
User.create(config["users"]) 
Category.create(config["categories"]) 
Product.create(config["products"]) 

Eseguire l'attività rastrello per caricare le righe

rake db:seed 
+0

Uomo, è così utile sapere. Grazie. È ancora rilevante in Rails 4? – Batman

+0

@Batman penso di si. Questo si basa sul parser YAML standard e sul metodo di creazione dell'array AR. –

10

Condivide la risposta accettata in realtà rispondere alla domanda? Sembra che il richiedente voglia salvare i modelli, non solo recuperarli da un file YAML.

In realtà salvare i modelli caricati di nuovo nel database che è necessario per ingannare ActiveRecord nel pensare che il modello deve essere salvato. Puoi farlo con questo bit un po 'sporco di codice

questions = YAML.load_file("#{RAILS_ROOT}/lib/tasks/questions/questions.yml") 
questions.each{|q| q.instance_variable_set("@new_record", true); q.save} 

Funziona e mi ha salvato il bacon una o due volte.

+0

Grazie, questo è il bit che ho bisogno per farlo funzionare. – Jurgen

+0

Questa dovrebbe essere la risposta accettata. Grazie! – cschille

Problemi correlati