Как удалить внедренный документ в mongomapper? - PullRequest
8 голосов
/ 20 декабря 2009

Привет, ребята. Я запускаю приложение sinatra с mongomapper. У меня есть модели под названием Movie (Document) и Cover (EmbeddedDocument). Я встраиваю обложки в фильмы, используя

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

Это прекрасно работает. когда нажал @ 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

Может кто-нибудь подумать, как его уничтожить? Было бы здорово, если бы кто-нибудь научил меня, как обновить внедренный документ.

Ответы [ 3 ]

15 голосов
/ 20 декабря 2009

Обложки хранятся в виде массива в объекте фильма, поэтому вы можете сделать, например ::

@movie.covers.clear
@movie.save

или если вы хотите быть избирательным

@movie.covers.delete_if {|cover| cover.name == "bla"}
@movie.save
1 голос
/ 23 сентября 2010

Это работает, если ваше удаление основано на атрибуте, таком как имя, но если вы уже знаете идентификатор и хотите его удалить, используйте этот трюк из сообщения t -ml p-rob :

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

Я действительно боролся с этим: (

0 голосов
/ 05 июля 2012

Вот быстрый и грязный полный список для удаления внедренного документа из ассоциации. Повторяется здесь:

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
...