2012-06-27 91 views
0

在我的代碼中,管理員可以添加用戶併爲他們分配任務。如果管理員決定刪除用戶,我想檢查用戶可能分配給的任何作業並將其更新分配給管理員。由於用戶刪除發生在我的user_controller並調用Jobs,這是最好的方式嗎?如果不是的話,可否請您提供一個最有效的方法來做到這一點,特別是如果用戶被分配到1-N作業?提前致謝。Rails:update_attribute調用多個控制器/模型?

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 

回答

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 
+0

謝謝,這很好。 – user464180

0

我先在一個實例變量選擇該用戶的工作,然後通過他們循環更新相關的外鍵管理員USER_ID。然後銷燬原始記錄。

1

我會建議使用上ActiveRecord::Relation

在你的情況update_all呼叫,一個簡單的方法來做到這一點是:

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

請注意,在較新版本的Rails(至少在尚未發佈的版本4)中,這將被阻止,因爲批量分配是危險的。因此,您需要將「user_id」屬性「白名單」列入白名單。

相關問題