每次更新Schedule
记录时,我都希望使用update_all
更新所有相关的Klass
记录。
Activity
has_many :schedules
Klass
belongs_to :activity
has_many :schedules
Schedule
belongs_to :activity
belongs_to :klass
belongs_to :city
belongs_to :partner
# Schedule attributes
klass_id
activity_id
# Klass form
<%= f.label :activity_id, "Category" %><br>
<%= collection_select(:klass, :activity_id, Activity.order(:name), :id, :name) %>
# KlassesController
def update
@partner = Partner.find(params[:partner_id])
@klass = @partner.klasses.find(params[:id])
if @klass.update(klass_params)
Schedule.where(klass_id: @klass.id).update_all(activity_id: klass_params[:activity_id])
redirect_to ...
else
...
end
end
private
def klass_params
params.require(:klass).permit(:name, :activity_id, :level,
:age_start, :age_end, :description)
end
但问题是update_all
命令崩溃了网络服务器(Webrick)。网络服务器只是...挂起。我尝试重新启动Webrick,但问题是可重复的。
奖励:每当我更新update_all
上的Schedule
属性时,我在City
上尝试Partner
时就会发生奇怪的事情,即网络服务器曾经撞了一次。但是在我重新启动Webrick之后,它没有任何问题。
# PartnersController
def update
@partner = Partner.find(params[:id])
if @partner.update(partner_params)
Schedule.where(partner_id: @partner.id).update_all(city_id: @partner.city_id)
redirect_to ...
else
...
end
end
City
has_many :schedules
Partner
belongs_to :city
has_many :klasses
has_many :schedules
我的问题是:有没有其他方法可以在不使用update_all
的情况下更新相关记录?或update_all
是正确的方法,但网络服务器是问题?或者我做错了什么?
答案 0 :(得分:0)
显然Webrick崩溃是因为我在另一个终端标签中运行了rails console
。退出控制台并重新启动Webrick解决了这个问题。
但我仍然很好奇是否有另一种方法可以在不使用update_all
的情况下批量更新相关记录。
修改强>
正如Tadman的建议,我简化了update_all
的查询:
# KlassesController
@klass.schedules.update_all(activity_id: klass_params[:activity_id])
# PartnersController
@partner.schedules.update_all(city_id: @partner.city_id)