2009-12-20 28 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