控制器操作需要根据某些参数计算值,其结果需要在同一操作中更新
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
的调用。
为什么会这样,如何克服?
答案 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 将被执行。不像我想的那么低效。但仍感到愚蠢。