문제

Rails 앱에는 다음 단계를 포함하는 일련의 마이그레이션이 있습니다.

  1. '사용자' 모델의 기본 버전 생성
  2. 이 모델의 인스턴스를 생성합니다. 로그인하여 사용할 수 있으려면 내 시스템에 최소한 한 명의 초기 사용자가 있어야 합니다.
  3. 새 필드/열을 추가하려면 '사용자' 모델을 업데이트하세요.

이제 이 새 필드/열에 "validates_inclusion_of"를 사용하고 있습니다.이는 이러한 마이그레이션이 적용된 데이터베이스가 이미 있는 초기 개발 컴퓨터에서 제대로 작동했습니다.그러나 새로운 머신으로 이동하여 모든 마이그레이션을 실행하면 마이그레이션 3의 필드가 아직 모델 클래스에 추가되지 않았기 때문에 verifys_inclusion_of가 실패하기 때문에 2단계가 실패합니다.

해결 방법으로 "validates_..." 줄을 주석 처리하고 마이그레이션을 실행한 다음 주석 처리를 제거할 수 있지만 이는 좋지 않습니다.

모든 열이 추가된 후 사용자 생성(2단계)이 마지막에 오도록 마이그레이션 순서를 변경하는 것이 더 좋습니다.

저는 레일즈 초보자이기 때문에 이 상황을 처리하는 데 선호되는 방법이 무엇인지 물어보고 싶습니다 :)

도움이 되었습니까?

해결책

이 문제를 피하는 가장 쉬운 방법은 두 번째 시스템에서 db: migration 대신 rake db:schema:load를 사용하는 것입니다.D:S:L은 스키마를 처음부터 마이그레이션하는 대신 스키마의 최신 버전을 로드하기 위해 Schema.rb를 사용합니다.

프로덕션 머신(데이터 보존이 중요한 경우)에 배포할 때 이 문제가 발생하는 경우 충돌 없이 마이그레이션을 단일 파일로 통합해야 할 수 있습니다.

다른 팁

마이그레이션 내에서 동일한 이름을 가진 클래스를 선언할 수 있으며, 이는 앱/모델을 재정의합니다.

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

  def self.up
    # User.create(:name => 'admin')
  end

end

불행하게도 IDE는 이 클래스를 기반으로 자동 완성을 시도할 수 있으며(Netbeans는 수행함) 거기에서 모델 로직을 사용할 수 없습니다(복제하는 경우 제외).

지금 당장 이 일을 해야 해요.BiHi의 조언을 바탕으로 모델을 수동으로 로드한 다음 필요한 곳에서 메서드를 재정의하고 있습니다.

load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
  def before_validation; nil; end # clear out the breaking before_validation
  def column1; "hello"; end       # satisfy validates_inclusion_of :column1
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top