7

私はmongomapperでsinatraアプリケーションを実行します。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

それを破壊する方法は?誰かが埋め込まれたドキュメントを更新する方法を教えてくれたら素晴らしいと思います。

4

3 に答える 3

15

表紙はムービーオブジェクト内に配列として保存されるため、次のように実行できます。

@movie.covers.clear
@movie.save

またはあなたが選択的になりたい場合

@movie.covers.delete_if {|cover| cover.name == "bla"}
@movie.save
于 2009-12-20T20:43:32.610 に答える
1

これは、名前などの属性に基づいて削除する場合に機能しますが、ID を既に知っていてそれを削除したい場合は、p-rob のtubmlr 投稿からこのトリックを使用します。

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

私はこれに本当に苦労しました:(

于 2010-09-23T04:56:31.250 に答える
0

これは、関連付けから埋め込みドキュメントを削除するための簡単で汚い完全な要点です。ここで繰り返されます:

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
于 2012-07-05T02:19:18.160 に答える