2012-06-27 2 views
0

내 코드에서 관리자는 사용자를 추가하고 작업을 할당 할 수 있습니다. 관리자가 사용자를 삭제하기로 결정한 경우 사용자에게 할당 될 수있는 작업이 있는지 확인하고 할당을 관리자에게 업데이트하려고합니다. 사용자 삭제가 내 user_controller 및 Jobs에서 발생하기 때문에 이것이 최선의 방법입니까? 그렇지 않다면, 특히 사용자가 1-N 작업에 배정 된 경우이를 수행하는 가장 효율적인 방법에 대해 조언 해 주실 수 있습니까? 미리 감사드립니다.레일즈 : 여러 컨트롤러/모델을 호출하는 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

당신은 하나 개의 SQL 쿼리를 실행하기 위해 #update_all 방법을 사용할 수 있습니다 귀하의 경우에 ActiveRecord::Relation

update_all 호출을 사용하여 제안하는 간단한 방법은 것 일어날 수 있도록 :

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

Rails의 최신 버전 (적어도 출시되지 않은 4 버전)에서는 대량 할당이 위험하므로이 문제가 방지됩니다. 이 때문에 user_id 특성을 '허용 목록에 추가'하고 싶습니다.

+0

감사합니다. – user464180

0

내가 처음 인스턴스 변수에 해당 사용자의 작업을 선택 것이다, 그들에 다음 루프는 관리자의 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

나는 것을 current_user.id 여기

우리가 @ user.id, USER_ID 설정의 USER_ID 모든 작업을 업데이트 할 것입니다 :

관련 문제