2010-10-29 4 views
0

J'ai une application rails dans laquelle je souhaite remplir les champs et les associations d'un modèle via un téléchargement de fichier. L'utilisateur reçoit un formulaire avec un élément d'entrée de téléchargement de fichier, puis après avoir cliqué sur Soumettre, l'application Rails analyse le fichier et l'utilise pour créer un certain nombre d'autres modèles.Comment puis-je remplir un modèle d'activationecord (et ses associations) à partir d'un fichier téléchargé

Un exemple simplifié ressemblerait à ceci (à noter que par souci de concision celui-ci utilise paperclip pour le téléchargement de fichiers):

class Parent < ActiveRecord::Base 
    has_many :children, :class_name => 'Child' 

    has_attached_file :attachment 

    after_initialize do |parent| 
     File.open(attachment.path) do |file| 
     process(file) 
     end 
    end 

    private 

    def process(attachment_file) 
     # create some new children using the attachment, perhaps this? 
     attachment_file.each_line |line| 
     # note that the children can either be new or existing. 
     self.children << Child.find_or_initialize_by_message(:message => line) 
     end 
    end 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

Mais mon problème est que lorsque je sauve mon objet parent, il est des enfants n'épargnent pas . (J'utilise Rails 2.3.10 et Ruby 1.8.7)

Ce qui est étrange, c'est que cela fonctionne avec Rails 2.3.4, mais pas dans aucune version par la suite. Quelqu'un at-il de bonnes suggestions pour ce que je pourrais faire de mal? Ou une meilleure façon de réaliser la même chose?

Merci d'avance pour votre aide - cela me rend fou!

+0

J'ai mis à jour mon exemple pour montrer le correctif suggéré par Krunal. – iainbeeston

Répondre

0

Essayez de cette façon!

attachment_file.each_line |line| 
    # note that the children can either be new or existing. 
    self.children << Child.find_or_initialize_by_message(:message => line) 
end 
+0

Merci pour l'indice! Mais je crains qu'en simplifiant mon exemple, j'ai raté quelque chose d'important: dans mon cas, les enfants sont ajoutés en utilisant une classe externe (je suis le modèle de conception du constructeur), donc c'est plus comme 'Parent.children << Child .find_or_initialize_by_message (: message => ligne) '. Donc (je pense) je fais déjà implicitement ce que vous suggérez. – iainbeeston

+0

Avez-vous essayé ce code? cela doit fonctionner .. –

+0

Mon point est que c'est ce que je fais déjà (sous la forme '@parent.children << Child.find_or_initialize_by_message (: message => ligne) ') – iainbeeston

Questions connexes