【发布时间】:2019-11-26 05:45:49
【问题描述】:
我正在控制器文件中编写一个 #create 方法,该方法随后会更新多个不同的表。
一旦我在预订表中使用reservation#create 创建预订,它应该会更新其他三个表:
1) quantity_available 和 quantity_ordered 在菜单表中
2) meal_credits_left Account_Summaries 表
3) total_number_ordered 在餐桌上
我的Api::ReservationsController 看起来像这样:
def create
@user = current_user
user_summary = @user.account_summary
@reservation = Reservation.new(
user_id: params[:reservation][:user_id],
menu_id: params[:reservation][:menu_id],
)
if @reservation.save
menu = @reservation.menu
meal = @reservation.meal
user_summary.update_attributes(
meal_credits_left: user_summary.meal_credits_left - 1
)
menu.update_attributes(
quantity_available: menu.quantity_available -1,
quantity_ordered: menu.quantity_ordered + 1
)
meal.update_attributes(
total_number_ordered: meal.total_number_ordered + 1
)
render :show
else
render json: @reservation.errors.full_messages, status: 422
end
end
如何设置路由以确保可以更新ReservationsController#create 中的这些属性?
我的路线如下所示:
resources :account_summaries, only: [:create, :update]
resources :reservations, only: [:index, :create, :update, :destroy]
resources :menus, only: [:index, :update]
resources :meals, only: [:index, :update]
【问题讨论】:
-
观察:在进行这样的非原子更新时,请考虑使用数据库支持的事务。
-
我不明白为什么当您的操作已经按照您所说的进行时,您为什么要询问路由配置。 (顺便说一句,我会用
meal.increment!(:total_number_ordered)和user_summary.decrement(:meal_credits_left)把它弄干一点)
标签: ruby-on-rails controller crud nested-routes