2012-09-21 3 views
2

Je veux être en mesure de remplacer l'ensemble des documents incorporés dans un objet MongoDB lors de la sauvegarde - le formulaire HTML contiendra le nouvel ensemble entier. Je veux aussi qu'il valide tout avant de sauvegarder, c'est-à-dire ne pas jeter les anciens documents, puis valider chacun au fur et à mesure de son ajout.Remplacer les documents incorporés sur enregistrer dans Mongoid

J'ai mis au point une implémentation, mais elle ne persiste pas - aucun des nouveaux documents incorporés n'apparaît. Une complication supplémentaire est qu'il y a un héritage impliqué. Voici (simplifié) l'ensemble des modèles que j'ai jusqu'à présent:

class Person 
    include Mongoid::Document 
    embeds_many :vehicles 
end 

class Vehicle 
    include Mongoid::Document 
    embedded_in :person 
end 

class Car < Vehicle 
end 

class Motorbike < Vehicle 
end 

Afin d'élaborer ce type de véhicule à instancier lorsque l'utilisateur soumet le formulaire, j'ai ajouté cette méthode pour la classe Person:

def build_from_hash(hash) 
    @vehicles= [] 
    hash.each do |idx, vehicle| 
     if vehicle[:_type].constantize < Inclusion # Check for inheritance, for security 
     self.vehicles.push vehicle[:_type].constantize.new(vehicle) 
     end 
    end 
end 

et modifié le contrôleur pour l'appeler:

def submit_build 
    @person= current_user.persons.find(params[:id]) 
    @person.build_from_hash(params[:vehicles]) if params.has_key? :vehicles 

    respond_to do |format| 
    if @person.save # Also tried: @person.update_attributes(inclusions: @person.vehicles) 
     format.html { redirect_to @person, notice: 'Person was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: "build" } 
     format.json { render json: @person.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Aucune erreur généré - la page réoriente comme si elle avait travaillé, mais quand je l'examine à nouveau il n'y a pas de documents embdedded.

Utilisation de Rails 3.2.8, Mongoid 3.0.5, MongoDB 1.8.3.

Répondre

0

J'ai trouvé comment faire cela d'une manière plus standard Rails-esque, mais avec une solution de contournement pour un comportement particulier. Réponse courte: la classe Person nécessaire à accepts_nested_attributes_for :vehicles et j'ai dû supprimer tous les trucs personnalisés du contrôleur, en remplaçant l'action par une action de mise à jour standard. Mais il ne serait pas accepter le paramètre _type pour les sous-classes de véhicules à moins que le processus Rails avait déjà instancié un objet de chacune de ces sous-classes, donc je suis obligé de travailler autour d'elle avec un initialiseur comme celui-ci:

Car.new 
Motorbike.new 

La réponse longue est on the Mongoid Google group.

Questions connexes