在同一个实例的多个请求中,rails无法处理数组列类型的更新

时间:2018-06-06 06:37:05

标签: ruby-on-rails-5

我从前端收到多个请求到端点。 例如,前端将10张图像上传到谷歌云,每当前端从谷歌云获得响应时,他们会对后端进行API调用,以便将资产记录存储在数据库中。在数据库中,asset_ids存储在数组类型为asset_ids的列中。现在问题是,在10个图像中,一些图像没有保存在数组列中。 一些请求试图覆盖数组列中的先前数据。

注意: - 当我尝试使用乐观锁定时,我得到的异常为ActiveRecord::StaleObjectError。那么,什么是解决问题的闲置方法。

以下是处理请求的端点。

def upload_assets
    gcs = GoogleCloud::StoreAssetDetail.new(file_upload_params, current_user: current_user)
    if gcs.process
      @gallery.asset_ids << gcs.asset_id
      @gallery.name = gallery_params[:name] if gallery_params[:name].present?
      if @gallery.save
        asset = Asset.find(gcs.asset_id)
        render json: { asset_id: asset.id, imgix_url: asset.decorate.imgix_cdn }, status: :created
      else
        respond_with_error(@gallery.errors.full_messages.join(', '), :unprocessable_entity, @gallery.errors)
      end
    else
      respond_with_error(gcs.errors.full_messages.join(', '), :unprocessable_entity, gcs.errors)
    end
  rescue ActiveRecord::StaleObjectError
    puts "Error while uploading"
  end

1 个答案:

答案 0 :(得分:0)

我找到了我面临的问题的解决方案。问题的原因是尝试同时更新同一记录的多个请求。因此,浏览了有关陈旧对象的rails文档,并继续使用悲观锁定方法。在悲观锁定中,对象被锁定并被禁止甚至被其他请求读取,除非锁被释放(在我的情况下,在保存记录时释放锁)。因此,这种方法解决了我的问题。