2009-04-15 4 views
11

ActiveRecord Migrations에 관한 많은 이야기와 응용 프로그램 내에서 데이터를 변경해야하는지 여부에 대해 많은 사람들이 보았습니다. 내 질문은 당신이 마이 그 레이션을 사용하지 않는 경우 다음 무엇을 사용하고 있습니까? 당신이 쓴 또 다른 스크립트?Rails App Data를 어떻게 변경합니까?

대체 방법에 대한 제안과 마이그레이션이 마이그레이션을 사용하는 것보다 나은 이유에 대해 설명합니다. 당신이 제공

rake db:reset 

데이터베이스를 설정하기위한 기초로 schema.rb를 사용
rake db:schema:load 

작업을 사용하는 경우

답변

14

하나의 문제는 온다. 따라서 어떤 데이터도로드되지 않고 멈추게됩니다. (? 루비 책은 "곡괭이"책의 경우이 BTW은 "해먹"책이어야한다) 당신이 아직하지 않은 경우 얻어야한다 Agile Web Development with Rails, Third Edition에서

, DHH는 말한다 :

... 마이그레이션은 실제로 시드 데이터를 전달하지 않습니다. 너무 안정적으로 수행하기에는 시간적으로 너무 빠릅니다. 스크래치에서 새로운 스키마를 만들지 않으려면 에서 으로 마이그레이션해야합니다. 여기에 db/schema.rb 파일 이 있습니다.

그래서, 바로 당신이 실제로 실제 응용 프로그램과 함께 가야로, 사람들이 응용 프로그램을 설정할 때 조기 마이그레이션을 실행하지 않습니다. db/schema.rb에 저장된 버전은 부터 시작하여 이전에 수행 한 모든 이전 버전은 무시합니다 ( ). 즉, 에 의해 생성 된 데이터는 데이터베이스에 저장되지 않으므로 에 의존 할 수 없습니다.

대체 시드 방법이 더 많습니다. 영구 시드 데이터입니다. 가장 쉬운 방법은 입니다. db/seed.rb에 새 파일을 작성하는 것입니다.이 파일에는 Product.cod를 호출하여 설정을 수행합니다. rake db : schema : load가 초기 스키마를 생성 한 후이 파일을 이라고 부를 수 있습니다.

+1

실제로'rake db : reset'도'rake db : seed'를 실행하기 때문에, 시드 파일의 어떤 데이터도 함께로드됩니다. – lobati

4

많은 경우 마이그레이션이 가장 적합하며 별도의 스크립트로 대체 할 수 없습니다. 다음 시나리오를 생각해보십시오. 응용 프로그램이 실제 데이터와 함께 이미 사용 중입니다. 코드 열에는 "name-zip_code"형식의 코드가 포함되어 있습니다 (예 : 추한 것을 알고 있지만 발생합니다). 그리고이를 'name'과 'zip_code'의 두 열로 나눌 때 ' 코드 '열.


def self.up 
    add_column :companies, :zip_code, :integer 
    add_column :companies, :name, :string 
    Company.reset_column_information 
    Company.find(:all).each do |company| 
    name, zip_code = company.code.split('-') 
    company.update_attributes(:name => name, :zip_code => zip_code) 
    end 
    remove_column :companies, :code 
end 

이 경우 코드 열은 데이터가 이름 및 우편 번호 열로 전송되기 전에 제거 할 수 없습니다.

1

데이터베이스의 일부 데이터를 수정해야 할 경우 작업을 수행하기 위해 일부 라이브러리 기능을 실행하는 레이크 (Rake) 작업을 생성합니다.이렇게하면 데이터 조작을 반복 할 수 있으며 필요한 경우 마이그레이션에서 실행할 수도 있습니다.

관련 문제