2013-03-20 5 views
1

RAILS 마이그레이션을 사용하여 데이터베이스의 테이블 데이터를 업데이트해야합니다.레일즈 마이그레이션 - 조건에 따라 행 수정

Sample: 
Table: Table_A(Col_A(number), Col_B(varchar),...) 
Query: UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY" 

RAILS 마이그레이션을 사용하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까? RAILS 마이그레이션이 데이터베이스의 데이터를 업데이트하는 방법인지 확실하지 않습니다. 어떤 설명이 도움이 될 것입니다.

class YourMigration < ActiveRecord::Migration 
    def up  
    execute('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"') 
    end 

    def down 
    end 
end 

을 또는 :

+0

마이그레이션을 사용하여 데이터를 변경하는 것이 나쁜 이유는 이전 질문에 대한 2 번째 대답을 참조합니다. http : // stackoverflow.com/questions/849897/can-rails-migrations-be-used-convert-data – fmendez

답변

3

그것은 레이크 작업에서 빅 데이터 업데이트 이러한 종류의 작업을 수행하는 것이 좋습니다. 보통 레이크 change_lots_of_data :보고 및 레이크 change_lots_of_data : update의 두 가지 버전이 있도록 작성합니다. '보고서'버전은 단지 where 절을 실행하고 변경 될 내용의 목록을 출력합니다. 'update'버전은 매우 동일한 where 절을 사용하지만 변경합니다.

이런 식으로 일을 어떤 장점

은 다음과 같습니다
  • 마이그레이션

    는 데이터베이스의 구조를 변경하는 저장
  • 당신은 자주 당신이 바로 그 기록이 있는지 확인하려면로 '보고서'버전을 실행할 수 있습니다 업데이트 될 예정입니다.
  • 레이크 작업에서 호출 한 클래스를 단위 테스트하는 것이 더 쉽습니다.
  • 변경 사항을 다시 적용하기 위해 동일한 기준을 적용해야하는 경우, 레이크 작업을 다시 실행할 수 있습니다. 마이그레이션을 수행하는 것이 가능하지만 더 까다 롭습니다.
+0

여기에 전적으로 동의합니다. 큰 데이터 업데이트는 갈퀴 작업으로 남겨 두는 것이 가장 좋습니다. DB 구조를 변경하는 다른 마이그레이션이 뒤 따르는 마이그레이션에서 이런 종류의 작업을 시도 할 때 두려움을 겪었으므로 연속적인 마이그레이션 실행이 폭발적으로 실패합니다. – nzifnab

0
ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX' where Col_B = 'YYY') 
1

이 같이 할 수

class YourMigration < ActiveRecord::Migration 
    def up 
    update('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"') 
    end 

    def down 
    end 
end 
2

이것은 레이크 작업에서 수행해야합니다 ...

namespace :onetime do 
    task :update_my_data => :environment do 
    TableA.where(Col_B: "YYY").update_all(Col_B: "XXX") 
    end 
end 

을 그런 후 배포 :

rake onetime:update_my_data

내 회사에서 프로덕션 환경에서 실행 된 후 일급 네임 스페이스 레이크 작업의 내용을 삭제합니다. 우리를위한 대회 일거야. update_all 방법에 대한

자세한 내용 : http://apidock.com/rails/ActiveRecord/Relation/update_all

+0

틀렸어. 테이블을위한'Model'에 대한 언급은 없습니다. 그리고 마이그레이션에서'Model'을 사용하는 것은 좋지 않습니다. – codeit

+1

왜 내가 "당신의 테이블에 모델이 있다면"이라고 말하지 않습니까 ??? 그의 테이블에 모델이 없다는 것을 어떻게 알 수 있습니까? 마이그레이션에서 일종의 대량 업데이트를 수행하는 것이 좋지 않다고 주장합니다. 레이크 작업 만하십시오. – nzifnab

+0

테이블에 모델이 연결되어있는 경우 위의 방법으로 실행하거나 사용하는 것이 더 좋습니다. – kanap008

2

나는 그게 명백한

  1. 입니다 그래서 갈퀴 작업에서 모든 데이터베이스 데이터 변경을 선호
  2. 반복
  3. 나중에 rake db:migrate

비아 실행되지 않습니다 코드 :

namespace :update do 
    desc "Update table A to set Col_B to YYY" 
    task :table_a => :environment do 
     TableA.where(Col_B: "YYY").update_all(Col_B: "XXX") 
    end 
    end 
end 

그런 다음 rake update:table_a을 사용하여 업데이트를 실행할 수 있습니다.

+0

Grr,'namespace' 행을 코드로 받아 들일 수 없습니다. : p –

+1

나는 당신을 위해 그것을 고쳤다. 건배. PS : Stackoverflow는 정렬 된 목록 바로 다음에 코드를 처리 할 수없는 것처럼 보입니다. 따라서 중간에 텍스트가 있어야합니다. – Magne