2014-10-02 106 views
0

在軌道4應用程序,我有兩個型號刪除現有機型的的has_many關係:添加和使用嵌套屬性

class Gallery 
    include Mongoid::Document 

    has_many :thumbnails 
end 

class Thumbnail 
    include Mongoid::Document 

    belongs_to :gallery 
end 

我與他們的縮略圖和一些未使用的縮略圖填充的MongoDB數據庫與一羣畫廊(沒有gallery_id)。

現在在客戶端我用木偶與骨幹,協會和我所代表的畫廊像這樣:

class Entities.Gallery extends Backbone.AssociatedModel 
    idAttribute: '_id' 
    urlRoot: '/galleries' 
    paramRoot: 'gallery' 

    relations: [ 
    type: Backbone.Many 
    key: 'thumbnails' 
    remoteKey: 'thumbnails_attributes' 
    relatedModel: -> Entities.Thumbnail              
    ] 

    initialize: ->                
    @on 'add:thumbnails', (thumbnail) => thumbnail.set 'gallery_id', @get('_id') 

class Entities.Thumbnail extends Backbone.AssociatedModel 
    idAttribute: '_id' 

但我也有未使用的縮略圖的集合:

class Entities.UnusedThumbnails extends Backbone.Collection 
    model: Entities.Thumbnail 

    initialize: -> 
    @on 'add', (thumbnail) -> thumbnail.set 'gallery_id', null 

我可以在畫廊和UnusedThumbnails集合之間移動縮略圖很好,但我如何堅持它們?

如果我剛剛從UnusedThumbnails集合添加縮略圖畫廊縮略圖和使用節省空間:

gallery.save([], patch: true) 

我得到一個404迴應說:「文件(S)未找到類縮略圖,ID( s)...「這是有道理的,因爲rails只在畫廊內搜索帶有此id的縮略圖。

同樣用於從圖庫中刪除縮略圖,如果我張貼缺少縮略圖的圖庫,則rails更新方法將假定這些縮略圖保持不變。

是否需要分別保存每個添加/刪除的縮略圖?

這樣做的正確方法是什麼?

編輯: 我知道我可能會需要建立一個專門的更新動作,像update_strict(缺乏一個更好的名字)

def update_strict 
    new_ids = gallery_params[:thumbnails_attributes].map(&:_id) 
    existing_ids = @gallery.thumbnails_ids 

    ids_to_add = new_ids - existing_ids 
    ids_to_remove = existing_ids - new_ids 

    @gallery.thumbnails.find(ids_to_remove).each |thumbnail| do 
    thumbnail.gallery = nil 
    thumbnail.save 
    end 

    ids_to_add.each |id| do 
    thumbnail = Thumbnail.find(id) 
    thumbnail_params = (gallery_params[:thumbnails_attributes].select { |t| t._id == id })[0] 
    thumbnail.update(thumbnail_params) 
    end 

    gallery_params[:thumbnails_attributes].delete_if { |thumbnail| ids_to_add.include?(thumbnail._id) } 

    respond_to do |format| 
    if @gallery.update(gallery_params) 
     format.html { redirect_to @gallery, notice: 'Gallery was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: 'edit' } 
     format.json { render json: @gallery.errors, status: :unprocessable_entity } 
    end 
    end 
end 

但有一個正確的,更清潔的方式?

回答

0

我終於結束了在畫廊模式覆蓋thumbnails_attributes=

def thumbnails_attributes=thumbnails_attributes) 
    ids = thumbnails_attributes.map { |t| t['id'] } 
    (ids - thumbnail_ids).each do |id| 
    thumbnail = Thumbnail.find id 
    thumbnails << thumbnail 
    end 
    super(thumbnails_attributes) 
end 

這讓我現有的縮略圖自動添加到庫中。 允許它們移除的最簡單方法是切換到backbone-nested-attributes,它將_destroy屬性添加到銷燬的模型。