2009-12-20 4 views
8

Salut les gars J'utilise une application sinatra avec mongomapper. J'ai modèles appelés films (document) et le couvercle (EmbeddedDocument) .Je embed couvre dans les films à l'aideComment supprimer un document incorporé dans mongomapper?

@movie.covers << @cover 
@movie.save 

Cela fonctionne très bien. lorsque hit @ movies.covers J'ai obtenu le tableau de documents incorporés. Mais je ne suis pas capable de détruire le document incorporé. J'ai essayé quelque chose comme ça

@movie.covers.each do |c| 
c.destroy 
end 

NoMethodError: undefined method `destroy' for #<Cover:0xb7b20734> 
from (irb):5 
from /usr/lib/ruby/gems/1.8/gems/mongo_mapper-0.6.8/lib/mongo_mapper/associations/proxy.rb:85:in `call' 
from /usr/lib/ruby/gems/1.8/gems/mongo_mapper-0.6.8/lib/mongo_mapper/associations/proxy.rb:85:in `method_missing' 
from /usr/lib/ruby/gems/1.8/gems/mongo_mapper-0.6.8/lib/mongo_mapper/associations/proxy.rb:85:in `each' 
from /usr/lib/ruby/gems/1.8/gems/mongo_mapper-0.6.8/lib/mongo_mapper/associations/proxy.rb:85:in `send' 
from /usr/lib/ruby/gems/1.8/gems/mongo_mapper-0.6.8/lib/mongo_mapper/associations/proxy.rb:85:in `method_missing' 
from (irb):4 
from :0 

Quelqu'un peut-il essayer de le détruire? Ce serait génial si quelqu'un m'éclairait comment mettre à jour le document incorporé.

Répondre

15

Covers sont stockés sous forme de tableau dans l'objet de film, vous pouvez donc faire par exemple:

@movie.covers.clear 
@movie.save 

ou si vous voulez être sélectif

@movie.covers.delete_if {|cover| cover.name == "bla"} 
@movie.save 
+0

Merci pzol. Ça m'a aidé. Il serait très utile si vous pensez comment je peux mettre à jour les couvertures. – Deepak

+0

Vous chargez le film. Les couvertures sont un tableau, vous devez donc en choisir une, modifier ses champs, puis enregistrer: Par exemple @movie = Movie.find (: first) @ movie.covers [0] .name = "nom mis à jour" @ movie.save –

1

Cela fonctionne si votre suppression basée sur un attribut comme un nom, mais si vous connaissez déjà l'identifiant et que vous voulez le supprimer, utilisez cette astuce de p-rob's tubmlr post:

def destroy 
@phone_number = @person.phone_numbers.find(params[:id]) 
@person.phone_numbers.delete_if{|phone_number| phone_number.id == @phone_number.id} 
if @person.save 
redirect_to @person 
    else 
    flash[:error] = "dag, yo." 
    end 
end 

J'ai vraiment lutté avec ceci :(

+1

Que faire si vous ne voulez pas charger la totalité de la matrice en mémoire avant de la supprimer? N'y a-t-il pas une opération qui va l'enlever du côté de la base de données? – hsribei

0

voici quick and dirty complete gist pour supprimer un document incorporé d'une association. Répété ici:

class Period 
    include MongoMapper::EmbeddedDocument 

    key :text, String 

    embedded_in :schedule 

    def to_s 
    text 
    end 

end 

class Schedule 
    include MongoMapper::Document 

    key :name, String 

    many :periods 

    def to_s 
    text = "#{name}, periods: " + periods.join(', ') 
    end 

end 

s1 = Schedule.create(:name => "Thursday", 
    :periods => [ 
    Period.new(:text => "Morning"), 
    Period.new(:text => "Afternoon"), 
    Period.new(:text => "Evening") 
    ]) 
puts s1 
#Thursday, periods: Morning, Afternoon, Evening 

s1.periods.delete_if{|p| p.text == 'Afternoon'} 
s1.save 
puts s1 
# Thursday, periods: Morning, Evening 
Questions connexes