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.