문제

이 예제와 같이 열에 대한 기본 설정을 설정하는 레일에 마이그레이션이 있어야한다는 문제가 있습니다.

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

나중에 마이그레이션에서 기본 설정을 삭제하고 싶습니다. 레일 마이그레이션을 사용하면 어떻게해야합니까?

내 현재 해결 방법은 다음과 같이 Rails 마이그레이션에서 사용자 정의 SQL 명령을 실행하는 것입니다.

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

그러나 나는이 접근법이 마음에 들지 않습니다. 이제 기본 데이터베이스 가이 명령을 해석하는 방법에 의존하기 때문입니다. 데이터베이스 변경의 경우이 쿼리는 더 이상 작동하지 않을 수 있으며 마이그레이션이 파손될 수 있습니다. 그렇다면 레일의 열에 대한 기본 설정의 실행 취소를 표현하는 방법이 있습니까?

도움이 되었습니까?

해결책

레일 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

레일 3 및 레일 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

다른 팁

소리 문서가 지적한 것처럼 '실행'으로 올바른 일을하는 것처럼 :

change_column_default(table_name, column_name, default)

열에 대한 새로운 기본값을 설정합니다. 기본값을 NULL로 설정하려면 운이 좋지 않습니다. Databasestatements#적절한 SQL 문을 직접 실행해야합니다.

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

내가 만드는 다음 스 니펫 NULLNOT NULL, 그러나 건너 뛰기 DEFAULT 스키마 수준에서 :

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

레일 4

change_column :courses, :name, :string, limit: 100, null: false
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top