2013-01-22 2 views
4

레일 프로젝트 빌드를 시작하는 데 도움이되도록 Rails Migrations에 대해 읽었습니다.모델에서 마이그레이션을 생성하는 레일

db/migrate에서 파일 생성에 대해 혼란스러워합니다.

내 응용 프로그램을 설계하는 방식은 모델로 시작하는 것입니다 ... 내가 할 수있는 한 최선을 다해 시스템에 포함시킬 모든 개체의 윤곽을 잡습니다. 레일 마이그레이션 생성기로이 모델로부터 자동으로 마이그레이션 파일을 생성하고 싶습니다.

예, "수동으로 마이그레이션을 만드는 것은 쉽습니다." 수동으로 처리 할 수 ​​있다는 것을 알고 있지만 이해할 수없는 것은 도구가 미리 만들어진 모델과 분리되어있는 이유입니다. 기사 및 SO 다른 마이그레이션 질문에서 내 이해를 바탕으로

, 정말 같은 마이그레이션을 생성 할 수 있습니다 : 나는 때 필드에 전달해야하는 이유

rails generate migration SomeObj field:string some_other_field:integer 

는 내가하지 않는 것은 내 모델은 SomeObj에 이미 존재합니까? Rails가 some_obj.rb에서 그것을 탐지하여 거기에서 마이그레이션을 생성 할 수 없습니까? 내가 has_many, belongs_to 및 has_to_and_belongs_to_many의 관계보다 복잡한 모델을,이 때이 (가) 테이블과 필드의 올바른 이름 (예 : foreign_obj_id, foreign_obj_ids)

가입 자동 생성 경우에도

는 정말 좋은 것 이전 프로젝트에서는 Mongo + Mongoid를 사용했기 때문에 마이그레이션을 처리 할 필요가 없었습니다. Mongo가 작동하는 방식 (삽입 또는 업데이트시 자동으로 생성되지 않는 컬렉션)으로 인해 컬렉션이 자동으로 생성되었습니다. 이제이 Rails 응용 프로그램을 사용하여 Postgres를 사용하고 있습니다 (하지만 MySQL 또는 다른 관계형 데이터베이스에서도 마찬가지입니다).

어쨌든 이런 종류의 도움이되지 않습니까? 이러한 모든 마이그레이션을 수동으로 만들어야합니까?

답변

10

당신은 이것을 거꾸로 가지고 있습니다. 마이 그 레이션을 먼저 작성하고 모델을 두 번째로 빌드해야합니다. 마이그레이션은 데이터베이스의 상태를 향상시킵니다. 귀하의 모델은 현재 상태의 데이터베이스를 반영합니다. 마이그레이션과 모델의 1 대 1 매핑은 없습니다.

레일 마이그레이션 생성기를 사용하여이 모델에서 자동으로 마이그레이션 파일을 생성하고 싶습니다.

할 수 없습니다.

rails generate migration을 사용하면 거의 부작용으로 스텁 모델 파일을 생성하는 마이그레이션을 생성 할 수 있습니다. 모델에 모델을 구성하는 실제 열에 대한 정보가 없기 때문에 기존 모델 파일을 사용하여 모델 마이그레이션을 생성 할 수 없습니다. 레일스는 귀하의 연관성/유효성 확인에서 필요한 모든 정보를 추출하고 암시해야만하고 심지어 열의 대부분이이 될 것입니다. 나는 더 복잡한 모델이 때이 (가) 다시 올바른 이름

으로 테이블과 필드 가입 자동 생성하는 경우

또한, ... 당신이 할 수없는, 정말 좋은 것입니다.당신은 데이터베이스 스키마를 정의 할 책임이 있으며 그렇게하는 방법은 마이그레이션을 구축하는 것입니다. 수동으로 또는 rails generate을 통해 수행 할 수 있지만 수행해야하는 프로세스는 첫 번째이며 두 번째 모델은 두 번째 마이그레이션입니다.

예로서

, 여기, 생산을위한 준비 완전한 모델 : 그 모델의 정의를 10 열 또는 1000 열을 포함하는 테이블을 포장 할 수

class MyModel < ActiveRecord::Base 
end 

; 당신 (그리고 레일스)은 모델 정의를 기반으로하는 방법을 전혀 알지 못합니다. 여기

는 적어도 하나 개의 열을 포함하는 다른 모델,하지만 다시, 당신은 열 어떤 종류의를 알 방법이 없다 :

class MyModel < ActiveRecord::Base 
    validates :code, presence: true, uniqueness: true 
end 

code 문자열 또는 숫자인가? 컬럼에 인덱스가 있어야합니까? 알 수있는 방법이 전혀 없습니다.

관련 문제