Rails:update_attribute调用多个控制器/模型?

时间:2012-06-27 19:40:17

标签: ruby-on-rails activerecord

在我的代码中,管理员可以添加用户并为其分配作业。如果管理员决定删除用户,我想检查用户可能被分配到的任何作业,并将其分配更新到管理员。由于用户删除发生在我的user_controller并调用Jobs,这是最好的方法吗?如果没有,请告知最有效的方法,特别是如果用户被分配到1-N个工作岗位?提前谢谢。

users_controller.rb

 def destroy
     if admin?
       jobs = Job.where("user_id = ?", params[:id]) #find jobs where user is that being deleted
       jobs.each do |job|         
        job.update_attribute(:user_id, current_user.id)  #for each job set the user_id to the admin_id
       end     
    end
    redirect_to users_url
  end

3 个答案:

答案 0 :(得分:1)

您可以使用#update_all方法仅执行一个SQL查询:

在这里,我们将使用@ user.id的user_id更新所有作业,将user_id设置为current_user.id

  def destroy
    @user = User.find(params[:id])
    if admin?
      Job.update_all {user_id: current_user.id}, {user_id: @user.id} 
    end
    @user.destroy
    redirect_to users_url
  end

答案 1 :(得分:1)

我建议在update_all

上使用ActiveRecord::Relation来电

在您的情况下,实现目标的一种简单方法是:

Job.where(user_id: params[:id]).update_all(user_id: current_user.id)

请注意,在较新版本的Rails中(至少在尚未发布的4版本中),这将被阻止,因为质量分配是危险的。因此,您需要将user_id属性“白名单”。

答案 2 :(得分:0)

我首先在实例变量中为该用户选择作业,然后循环将它们更新到admins user_id的相关外键。然后销毁原始记录。