Rails 문서에 따르면 : http://guides.rubyonrails.org/migrations.html
“Active Record는 이미 실행 된 마이그레이션을 추적하므로 소스를 업데이트하고 rake db : migrate를 실행하기 만하면됩니다.”
ActiveRecord는 실제로 어떻게 이것을합니까? Active Record는 데이터를 어디에 저장합니까?
이것이 데이터베이스 자체에 저장 될 수 있다고 생각합니까? 어딘가 테이블에.
내 개발 컴퓨터에서 모든 마이그레이션을 실행했습니다. 그런 다음 mysqldump를 사용하여 프로덕션 데이터베이스를 복사했습니다. 그런 다음 “rake db : migrate : status”를 실행하면 프로덕션 데이터베이스에서 실행해야하는 마이그레이션이 올바르게 표시됩니다.
저는 ActiveRecord가 타임 스탬프를 사용하여 마지막 마이그레이션 실행을 추적한다고 생각했습니다. 그러나 ActiveRecord는 다른 코드 분기에서 병합 된 “이전”마이그레이션을 올바르게 실행하기 때문에 이것이 사실이 아니라고 생각합니다.
이것에 대한 내부 지식을 가진 사람이 자세히 설명 할 수 있습니까? 감사
답변
Rails schema_migrations
는 어떤 마이그레이션이 실행되었는지 추적하기 위해 데이터베이스에 테이블을 생성 합니다.
테이블에는 단일 열인 version
. Rails가 마이그레이션을 실행할 때 마이그레이션 파일 이름의 선행 숫자를 사용하여 해당 “버전”에 대한 행을 삽입하여 실행되었음을 나타냅니다. 마이그레이션을 롤백하면 Rails는 schema_migrations
.
예를 들어라는 마이그레이션 파일을 실행 20120620193144_create_users.rb
하면 버전이있는 새 행 20120620193144
이 schema_migrations
테이블에 삽입됩니다.
언제든지 이전 버전으로 마이그레이션을 도입 할 수 있습니다. Rails는 항상에 해당하는 행이없는 새로운 마이그레이션을 실행합니다 schema_migrations
. 선행 숫자는 타임 스탬프 일 필요는 없으며 마이그레이션이라고 부를 수 있습니다 001_blah.rb
. 이전 버전의 Rails는이 형식을 사용했으며 새로 생성 된 마이그레이션에 순차적 인 번호를 사용했습니다. 이후 버전은 여러 개발자가 동일한 수의 마이그레이션을 독립적으로 생성하는 것을 방지하기 위해 타임 스탬프로 전환되었습니다.