Pregunta

Tengo un modelo con un campo binario que contiene un archivo. Me gustaría guardar este archivo en el disco como parte de un proceso que necesito hacer. Por alguna razón, no puedo encontrar nada sobre cómo hacer esto.

El modelo contiene un campo de nombre de archivo y un campo file_contents. Me gustaría hacer algo como esto:

model = SomeModel.find :first
model.file_contents.save_to_file(model.filename)

Cualquier ayuda se agradece!

¿Fue útil?

Solución

No sé por qué te gustaría llamar #save_to_file sobre el contenido del archivo en lugar del modelo. Desde que ha definido file_contents como un atributo AR supongo que desea guardarlo en la base de datos y guardarlo en el disco. Si ese es el caso simplemente puede añadir un método como este para su modelo:

 class YourModel < ActiveRecord::Base
   # ... your stuff ...
   def save_to_file
     File.open(filename, "w") do |f|
       f.write(file_contents)
     end
   end
 end

Y a continuación, sólo tiene que iba a hacer:

obj = YourModel.find(:first)
obj.save_to_file

Otros consejos

En ActiveRecord, el tipo :binary que se utiliza para definir el tipo de columna en su migración se va a asignar a un tipo blob en la base de datos. Por lo que no permitiría guardar en un archivo.

Creo que tendría que definir una clase de modelo que no es una subclase de ActiveRecord::Base y definir un método save_to_file personalizada para esa clase utilizando el archivo de E / S de apoyo en Ruby (la clase IO y de su subclase, File).

class SomeModel
 attr_accessor :file
 attr_accessor :contents

 def initialize
  @file = File.new("file.xyz", "w")
 end

 def save_and_close
  @file << contents
  @file.close
 end
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top