【发布时间】:2014-06-12 07:19:32
【问题描述】:
创建新的 HABTM 关联对我来说效果很好,但每次我尝试更新它们时,所有关联都会被删除。
这就是我的更新操作的样子。
def update
params[:dish][:cuisine_ids] ||= []
params[:dish][:diet_ids] ||= []
@user = current_user
@dish = @user.dishes_selling.find_by(:id => params[:id])
@dish.cuisines = Cuisine.where(:id => params[:dish][:cuisine_ids]) ### (1) ###
@dish.diets = Diet.where(:id => params[:dish][:diet_ids]) ### (1) ###
if @dish
respond_to do |format|
if @dish.update(dish_params) ### (2) ###
format.html { redirect_to dish_path(@dish), notice: 'Dish was edited.' }
else
format.html { render action: 'edit' }
end
end
else
flash[:error] = "You can only edit your dish!"
render :index
end
end
我的菜参数看起来像这样
def dish_params
params.require(:dish).permit(:title, :desc, cuisine_ids: [:id], diet_ids: [:id])
end
如果在编辑时我点击了两个美食复选框,则在步骤 (2) 中的日志会读取此内容(仅注意 Delete 并且没有更新或插入 cuisine_dishes 表)
(0.1ms) begin transaction
SQL (0.4ms) DELETE FROM "cuisines_dishes" WHERE "cuisines_dishes"."dish_id" = ? AND "cuisines_dishes"."cuisine_id" IN (7, 9) [["dish_id", 61]]
SQL (0.2ms) UPDATE "dishes" SET "desc" = ?, "updated_at" = ? WHERE "dishes"."id" = 61 [["desc", "yema1245"], ["updated_at", "2014-06-12 06:57:36.622811"]]
(5.5ms) commit transaction
Redirected to http://localhost:3000/dishes/61
Completed 302 Found in 48ms (ActiveRecord: 13.7ms)
问题:为什么更新HABTM关联会尝试删除关联,而不是尝试在以前不存在的情况下创建新的关联,如果之前存在但不再存在则删除。
【问题讨论】:
-
如果它是您想要的答案,您能接受吗?
标签: ruby-on-rails ruby-on-rails-4 rails-activerecord has-and-belongs-to-many