基于其他参数确定参数值的命令序列

时间:2015-12-18 15:13:23

标签: ruby-on-rails-4.2

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

  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的调用。

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

1 个答案:

答案 0 :(得分:0)

一种方法是修改序列

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

我期待对数据库进行多次点击,但注意到如果数据未更改,则 no commit 将被执行。不像我想的那么低效。但仍感到愚蠢。