在軌道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
但有一個正確的,更清潔的方式?