2009-12-20 50 views
8

嗨,伙计们我用mongomapper运行sinatra应用程序。我有称为电影(文档)和封面(EmbeddedDocument)的模型。我将封面嵌入到使用的电影中。如何删除mongomapper中的嵌入文档?

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

This works great。 hit @ movies.covers我得到了嵌入文档的数组。 但我无法销毁嵌入式文档。我试过这样的事情

@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 

任何人都可以temme如何摧毁它?如果有人启发我如何更新嵌入式文档,这将是非常好的。

回答

15

封面存储为影片对象中的数组,所以你可以做如:

@movie.covers.clear 
@movie.save 

,或者如果你想成为选择性

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

谢谢pzol。它帮助了我。如果你不知道如何更新封面,这将是非常有帮助的。 – Deepak 2009-12-21 05:00:28

+0

您加载电影。盖是一个数组,所以你需要选择一个,改变其字段,然后保存: 例如 @movie = Movie.find(:第一) @ movie.covers [0]。名称=“更新的名称” @ movie.save – 2009-12-21 18:33:54

1

这个工作,如果你删除基于属性像名字一样,但如果您已经知道该ID并想删除它,请使用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 

我真的很努力:(

+1

如果您不想在删除前将整个数组加载到内存中,该怎么办?没有将会在数据库端删除它的操作吗? – hsribei 2010-10-22 20:29:52

0

这里是一个quick and dirty complete gist用于从关联中删除一个嵌入式文档。重复在这里:

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