Как обновить с помощью сильного параметра?

#ruby-on-rails #strong-parameters

Вопрос:

Что я хочу сделать

В моем приложении есть Order модель и List модель. List модель-дитя Ордена.

Order имеет total колонку.
List имеет price и quantity колонки.

Я хочу обновить total Order их, добавив промежуточные итоги каждой lists строки вместе.

Что я сделал

Вот мой orders_controller.

 def update
    @order = Order.find(params[:id])
    @order.total = @order.total_price
    if @order.update(order_params)
      redirect_to orders_path, notice: 'The order has been updated.'
    else
      render :edit
    end
  end
 

Вот мой заказ.rb(модель)

   def total_price
    lists.to_a.sum { |list| list.subtotal }
  end
 

Чтобы обновить общую цену, я установил @order.total_price значение @order.total .
Но, как вы видите, он обновился с помощью сильного параметра( order_params ).
Я не мог решить, как обновить общую цену.

Что мне делать?

Окружающая среда

  • рубин2.7.2
  • рельс6

Комментарии:

1. Какие параметры у вас есть в order_params?

Ответ №1:

Есть много способов сделать это.

 # One is just to do it on separate lines.
@order.update(total: @order.total_price)
@order.update(order_params)

# Merge with order_params
@order.update(order_params.merge(total: @order.total_price))
 

Наконец, самый простой способ, вероятно, использовать a before_save на модели

 # Order.rb
before_save do
  total = lists.to_a.sum { |list| list.subtotal }
end

# orders_controller.rb
# just to
@order.update(order_params)