Carriles: guardar el contenido de un campo binario en un archivo
-
06-09-2019 - |
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!
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