代码之家  ›  专栏  ›  技术社区  ›  Deepak

如何删除MongoMapper中的嵌入文档?

  •  8
  • Deepak  · 技术社区  · 15 年前

    嗨,伙计们,我用MongoMapper运行了一个Sinatra应用程序。我有一个叫做电影(文档)和封面(嵌入文档)的模型。

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

    这很管用。 当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
    

    有人能告诉我怎么销毁它吗?如果有人告诉我如何更新嵌入的文档,那就太好了。

    3 回复  |  直到 10 年前
        1
  •  15
  •   Nazar Hussain    11 年前

    封面以数组形式存储在电影对象中,因此可以执行以下操作:

    @movie.covers.clear
    @movie.save
    

    或者如果你想有选择性

    @movie.covers.delete_if {|cover| cover.name == "bla"}
    @movie.save
    
        2
  •  1
  •   Nick Ryberg    14 年前

    如果您基于名称等属性进行删除,这是可行的,但是如果您已经知道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
    

    我真的很挣扎:(

        3
  •  0
  •   Jon Kern    10 年前

    这里是一个 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