Rails update_all依赖模型崩溃了Web服务器

时间:2015-06-22 16:11:45

标签: ruby-on-rails ruby-on-rails-4 activerecord

每次更新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是正确的方法,但网络服务器是问题?或者我做错了什么?

1 个答案:

答案 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)