2009-12-20 19 views
8

Ciao Ragazzi eseguo un'applicazione sinatra con mongomapper. Ho modelli chiamati video (documento) e di copertura (EmbeddedDocument) .I embed copre in filmati utilizzandoCome si elimina un documento incorporato in mongomapper?

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

Questa grande opera. quando hit @ movies.covers ho ottenuto la matrice di documenti incorporati. Ma non sono in grado di distruggere il documento incorporato. Ho provato qualcosa di simile

@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 

Qualcuno può temme come distruggerlo? Sarebbe bello se qualcuno mi illumini come aggiornare il documento incorporato.

risposta

15

coperture vengono memorizzati come una matrice all'interno oggetto filmato, quindi si può fare ad esempio:

@movie.covers.clear 
@movie.save 

o se si vuole essere selettivo

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

Grazie pzol. Mi ha aiutato. Sarebbe molto utile se temi come posso aggiornare le copertine. – Deepak

+0

Si carica il film. Le copertine sono un array, quindi è necessario sceglierne uno, modificarne i campi e quindi salvare: Ad esempio @movie = Movie.find (: first) @ movie.covers [0] .name = "nome aggiornato" @ movie.save –

1

Questo funziona se la cancellazione basa su un attributo come un nome, ma se conosci già l'ID e desideri eliminarlo, utilizza questo trucco da 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 

Ho davvero faticato :(

+1

Cosa fare se non si desidera caricare l'intero array in memoria prima dell'eliminazione? Non c'è un'operazione che lo rimuoverà dal lato del database? – hsribei

0

questo è un quick and dirty complete gist per l'eliminazione di un documento incorporato da un'associazione. Ripetuto qui:

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 
Problemi correlati