在我的代码中,管理员可以添加用户并为其分配作业。如果管理员决定删除用户,我想检查用户可能被分配到的任何作业,并将其分配更新到管理员。由于用户删除发生在我的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
答案 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的相关外键。然后销毁原始记录。