2009-12-20 3 views
8

Hallo Leute Ich führe eine Sinatra-Anwendung mit mongomapper. Ich habe Modelle Film (Dokument) und Abdeckung (EmbeddedDocument) .Ich einbetten deckt in Filme genanntWie lösche ich ein eingebettetes Dokument in mongomapper?

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

Dies funktioniert gut mit. wenn @ @ movies.covers getroffen habe ich das Array von eingebetteten Dokumenten. Aber ich kann das eingebettete Dokument nicht zerstören. Ich habe so etwas versucht

@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 

Kann jemand temme, wie man es zerstört? Es wäre großartig, wenn mir jemand aufklärt, wie man das eingebettete Dokument aktualisiert.

Antwort

15

Abdeckungen werden als Array im Film-Objekt gespeichert, deshalb können Sie tun, zB:

@movie.covers.clear 
@movie.save 

oder wenn Sie Dies funktioniert, wenn Ihr Löschen basierend auf einem Attribut selektiven

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

Dank pzol. Es hat mir geholfen. Es wäre sehr hilfreich, wenn Sie teme, wie ich Abdeckungen aktualisieren kann. – Deepak

+0

Sie laden den Film. Die Abdeckungen sind ein Array, also müssen Sie eines auswählen, seine Felder ändern und dann speichern: Zum Beispiel @movie = Movie.find (: erste) @ movie.covers [0] .name = "aktualisierter Name" @ movie.save –

1

sein wollen Wie ein Name, aber wenn Sie die ID bereits kennen und sie löschen möchten, verwenden Sie diesen Trick von 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 

Ich habe wirklich damit gekämpft :(

+1

Was ist, wenn Sie nicht das gesamte Array vor dem Löschen in den Speicher laden möchten? Gibt es keine Operation, die es auf der Datenbankseite entfernt? – hsribei

0

Hier ist ein quick and dirty complete gist zum Löschen eines eingebetteten Dokuments aus einer Assoziation. Wiederholt hier:

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