0

在我的代码中,管理员可以添加用户并为他们分配工作。如果管理员决定删除用户,我想检查用户可能被分配到的任何工作并将其分配给管理员。由于用户删除发生在我的 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
4

3 回答 3

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
于 2012-06-27T20:07:42.973 回答
1

我建议update_allActiveRecord::Relation

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

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

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

于 2012-06-27T20:10:58.987 回答
0

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

于 2012-06-27T19:48:17.037 回答