Rails: enregistrer le contenu d'un champ binaire dans un fichier
-
06-09-2019 - |
Question
J'ai un modèle avec un champ binaire contenant un fichier. Je voudrais enregistrer ce fichier sur le disque dans le cadre d'un processus que je dois faire. Pour une raison quelconque, je ne peux pas trouver quoi que ce soit sur la façon de le faire.
Le modèle contient un champ de nom de fichier et un champ de file_contents. Je voudrais faire quelque chose comme ceci:
model = SomeModel.find :first
model.file_contents.save_to_file(model.filename)
Toute aide serait appréciée!
La solution
Je ne sais pas pourquoi vous voulez appeler #save_to_file sur le contenu du fichier à la place du modèle. Depuis que vous avez défini file_contents comme un attribut AR Je suppose que vous voulez enregistrer dans le DB et enregistrer sur le disque. Si tel est le cas, vous pouvez simplement ajouter une méthode comme celui-ci à votre modèle:
class YourModel < ActiveRecord::Base
# ... your stuff ...
def save_to_file
File.open(filename, "w") do |f|
f.write(file_contents)
end
end
end
Et alors vous simplement faire:
obj = YourModel.find(:first)
obj.save_to_file
Autres conseils
Dans ActiveRecord, le type de :binary
que vous utilisez pour définir votre type de colonne dans votre migration va correspondre à un type blob
dans la base de données. Donc, cela ne vous permettra pas d'enregistrer dans un fichier.
Je pense que vous devez définir une classe de modèle qui n'est pas une sous-classe de ActiveRecord::Base
et définir une méthode de save_to_file
personnalisée pour cette classe en utilisant le fichier i / o soutien Ruby (la classe IO
et sa sous-classe, 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