2010-02-26 12 views
11

Estoy tratando de guardar algunos datos de la tabla de búsqueda en un archivo YAML para que luego, cuando necesite configurar mi aplicación en una máquina diferente, pueda cargar los datos como datos iniciales.¿Cómo puedo cargar algunos modelos de ActiveRecord desde un archivo YAML y guardarlos en el DB?

La información es similar a la de las opciones de selección, y está prácticamente configurada, por lo que no hay que preocuparse de que los datos en vivo cambien entre la serialización y la deserialización.

tengo salida de los datos como estos ...

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

Y puedo cargar el archivo como esto ...

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

Sin embargo, cuando intento guardar una pregunta que me hacen este error ...

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

¿Cuál es la forma correcta de hacerlo?

+0

¿Qué versión de Rails estás usando? –

+0

Estoy usando Rails 2.3.5 – Ethan

Respuesta

8

Probé su escenario y no tuve ningún problema. Hice los siguientes cambios en su lógica de creación del archivo 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 

yo era capaz de recuperar la lista questions de la siguiente manera:

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

Si está utilizando Rails 2.3.4 (o superior), tienen un archivo seeds.rb que se puede encontrar en su carpeta de aplicaciones db. Esto le permite definir registro activo básico crea, y cuando se haya instalado su nuevo proyecto, sólo tiene que llamar:

rake db:seed 

hay una excelente Railscast en él here, y un buen blog post sobre ello here. Si no está utilizando Rails 2.3.4 (o, idealmente, 2.3.5), le recomiendo que actualice estas características geniales, además de la seguridad/corrección de errores.

+0

Gracias, sí, eso es una gran característica. Quiero almacenar los datos en un archivo YAML y cargarlos usando 'seeds.rb'. Hay suficientes datos que dificultar la codificación de las instancias de modelo directamente en 'seeds.rb' sería incómodo. – Ethan

+0

seeds.rb es solo un archivo ruby. Puede cargar YAML dentro de seeds.rb como se describe aquí (http://ruby-doc.org/core/classes/YAML.html), y simplemente recorrer las matrices al hacer un Model.create(). –

20

Cree un archivo seed.yml en el directorio db. Agregue un documento YAML para cada modelo que quiera crear. Este documento debe contener una lista de hash. Cada hash debe contener atributos de modelo.

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: 

En el archivo 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"]) 

Ejecutar la tarea de rastrillo para cargar las filas

rake db:seed 
+0

Hombre, esto es muy útil saberlo. Gracias. ¿Sigue siendo relevante en Rails 4? – Batman

+0

@Batman Creo que sí. Esto se basa en el analizador YAML estándar y el método de creación AR array. –

10

¿La respuesta aceptada en realidad responde a la pregunta? Parece que el asker quería guardar los modelos, no solo recuperarlos de un archivo YAML.

Para guardar realidad el modelo cargado (s) de vuelta a la base de datos que necesita para engañar en el pensamiento de ActiveRecord el modelo necesita ser salvado. Puede hacerlo con este código bastante sucio del código

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

Funciona y guardó mi tocino una o dos veces.

+0

Gracias, este era el bit que necesito para que funcione. – Jurgen

+0

Esta debería ser la respuesta aceptada. ¡Gracias! – cschille

Cuestiones relacionadas