根据其他参数确定参数值的命令序列

Sequence of commands to determine param values based on other params

控制器动作需要根据一些参数计算值,其结果需要在同一个动作中更新

  def update
    calculate_weight_volume
    authorize @itme
    @itme.update(itme_params)

方法

def calculate_weight_volume
  if !params[:itme][:width].nil? && !params[:itme][:length].nil? && !params[:itme][:height].nil? && !params[:itme][:weight].nil?
    @weight_volume = (params[:itme][:width].to_d + 1) * (params[:itme][:length].to_d + 1) * (params[:itme][:height].to_d + 1) / conversion_factor
    if @weight_volume > params[:itme][:weight].to_d
      params[:itme][:weight_volume] = @weight_volume
    else
      params[:itme][:weight_volume] = @itme
    end
  end
end

不是用参数计算的,而是用记录的保存属性计算的。

除了 rails4 使用属性进行计算之外,很明显,在 update_params 开始之前,对方法 calculate_weight_volume 的调用被忽略了。

为什么会这样,如何克服?

一种方法是修改顺序

def update
  authorize @itme
  @itme.update(itme_params)
  calculate_weight_volume
  @debit.update_attributes(amount: params[:correction][:newamount])

并将方法更改为根据保存的值进行更新

此外,如果涉及其他模型的更新,这些操作应该在计算之后进行

def calculate_weight_volume
  if !@itme.width.nil? && !@itme.length.nil? && !@itme.height.nil? && !@itme.weight.nil?
    @weight_volume = (@itme.width.to_d + 1) * (@itme.length.to_d + 1) * (@itme.height.to_d + 1) / conversion_factor
    if @weight_volume > @itme.weight.to_d
      @itme.update(weight_volume: @weight_volume)
    else
      @itme.update(weight_volume: @itme.weight) 
    end
  end
end

我期待对数据库进行多次点击,但注意到如果数据未更改,不会执行任何提交。没有我想象的那么低效。但是还是觉得很蠢。