2009-12-20 23 views
8

Hi Guys Tôi chạy một ứng dụng sinatra với mongomapper. Tôi có các mô hình được gọi là Phim (Tài liệu) và Bìa (EmbeddedDocument) .Tôi nhúng vào phim bằng cách sử dụngLàm cách nào để xóa tài liệu được nhúng trong mongomapper?

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

Điều này thật tuyệt vời. khi nhấn @ movies.covers tôi nhận được mảng tài liệu được nhúng. Nhưng tôi không thể hủy tài liệu được nhúng. Tôi đã thử một cái gì đó như thế này

@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 

Bất kỳ ai cũng có thể phá hủy nó? Nó sẽ là tuyệt vời nếu ai đó làm sáng tỏ cho tôi cách cập nhật tài liệu được nhúng.

Trả lời

15

Covers được lưu trữ như một mảng trong đối tượng phim, do đó bạn có thể làm ví dụ:

@movie.covers.clear 
@movie.save 

hoặc nếu bạn muốn trở thành lựa chọn

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

Cảm ơn pzol. Nó đã giúp đỡ tôi. Nó sẽ rất hữu ích nếu bạn temme làm thế nào tôi có thể cập nhật bao gồm. – Deepak

+0

Bạn tải phim. Bìa là một mảng, vì vậy bạn cần phải chọn một, thay đổi trường của nó và sau đó lưu: Ví dụ: @movie = Movie.find (: first) @ movie.covers [0] .name = "updated name" @ movie.save –

1

này hoạt động nếu xóa của bạn dựa trên một thuộc tính giống như tên, nhưng nếu bạn đã biết id và muốn xóa nó, hãy sử dụng mẹo này từ 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 

Tôi thực sự đấu tranh với điều này: (

+1

Nếu bạn không muốn tải toàn bộ mảng vào bộ nhớ trước khi xóa thì sao? Không phải là có một hoạt động sẽ loại bỏ nó ở phía cơ sở dữ liệu? – hsribei

0

đây là một quick and dirty complete gist để xóa tài liệu được nhúng khỏi liên kết. Đã lặp lại ở đây:

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 
Các vấn đề liên quan