2015-01-19 2 views
0

열 (신용)의 모든 값을 지정된 양만큼 줄이는 방법이 필요합니다. 나는 시도했다 :레일의 모든 행의 db 값 감소시키기

User.all.map! {|user| user.credit -= 50} 

단지 사용자가 아닌 크레딧을 매핑한다. 정답은

User.update_all(something) 

을 사용하는 것입니다하지만이 방법을 사용하여 이전 값으로 상대적인 값을 업데이트하는 방법을 모르는 같은 느낌.

일반적인 요구 사항처럼 보입니다. 따라서 표준 접근 방식을 추측하고 있습니다.

User.all.each do |user| 
    user.credit = user.credit - 50 
    user.save! 
end 

을하지만,보다 효율적인 방법은 데이터베이스에있는 모든 행을 업데이트 할 것입니다 :

답변

5

당신이 예에서와 같이 update_all에 문자열을 전달할 수 있습니다

User.update_all("credit = credit - 50") 

출현 SQL :

UPDATE "users" SET credit = credit - 50 
+1

이 경우 유효성 검사와 콜백은 호출되지 않습니다. – Stefan

1

당신은 모든 행에 반복하고 각 레코드를 저장하는 것을 잊지 마세요, User.all를 업데이트 할 수 있습니다.

UPDATE users SET credit = credit - 50; 
+2

find_each는 일반적으로 페치를 일괄 처리하므로 모든 레코드를 반복 할 때 바람직합니다. –

1

당신은 사용해야 하나 update_all, @sufleR에 의해 제안, 또는 find_each : 당신은 같은 SQL을 발행 할 수

User.find_each{ |user| user.update!(credit: uuser.credit - 50) }