2009-12-20 13 views
8

Hola chicos Ejecutar una aplicación sinatra con mongomapper. Tengo modelos llamados Película (Documento) y la tapa (EmbeddedDocument) .I embed cubre en películas usando¿Cómo elimino un documento incrustado en mongomapper?

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

Esto funciona muy bien. cuando toco @ movies.covers Obtuve la matriz de documentos incrustados. Pero no puedo destruir el documento incrustado. Intenté algo como esto

@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 

¿Puede alguien temme cómo destruirlo? Sería genial si alguien me aclara cómo actualizar el documento incrustado.

Respuesta

15

cubiertas se almacenan como una matriz dentro objeto de película, por lo tanto, se puede hacer por ejemplo:

@movie.covers.clear 
@movie.save 

o si desea ser selectivo

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

Gracias pzol. Me ayudó. Sería muy útil si tienes en cuenta cómo puedo actualizar las portadas. – Deepak

+0

Carga la película. Las cubiertas son una matriz, por lo que debe elegir una, cambiar sus campos y luego guardar: Por ejemplo @movie = Movie.find (: first) @ movie.covers [0] .name = "updated name" @ movie.save –

1

Esto funciona si su eliminación basada en un atributo como un nombre, pero si ya conoce la identificación y desea eliminarla, use este truco desde 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 

Realmente luché con esto :(

+1

¿Qué sucede si no desea cargar toda la matriz en la memoria antes de eliminar? ¿No hay una operación que lo eliminará del lado de la base de datos? – hsribei

0

aquí está un quick and dirty complete gist para eliminar un documento incrustado de una asociación. Repetido aquí:

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 
Cuestiones relacionadas