ROR 마이그레이션 중에 열 유형을 Date에서 DateTime으로 변경


227

만들고있는 앱의 열 유형을 날짜에서 날짜 / 시간으로 변경해야합니다. 데이터가 아직 개발 중이므로 신경 쓰지 않습니다.

어떻게해야합니까?

답변:


508

터미널에서 먼저 :

rails g migration change_date_format_in_my_table

그런 다음 마이그레이션 파일에서

레일> = 3.2의 경우 :

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
당신이 바로, 난 그냥 초보자 최신 기술을 사용할 선택할 것 가정 만하고 그의 물론, 확실
apneadiving

12
질문은 "ruby-on-rails-3"
Sucrenoir

2
@Sucrenoir 네, 태그가 응답 한 후에 apneadiving에 의해 추가되었습니다.
Jason

10
하나의 이유를 궁금해하는 경우 change방법 대신으로 사용되지 updown방법 때문입니다 방법은 지원하지 않습니다 마이그레이션 정의를 . changechange_column
Dennis

2
이 답변은 부분적으로 만 정확하며 레일 4 또는 다운 마이그레이션에서도 작동하지 않는 change_column을 변경할 수 없습니다. 레일 버전에 관계없이 위 / 아래를 사용해야합니다.
Alan Peabody

78

또한 Rails 3 이상을 사용하는 경우 upand down메소드 를 사용할 필요가 없습니다 . 당신은 사용할 수 있습니다 change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
변경 방법은 가역 마이그레이션에서만 작동합니다. 위의 코드는 ActiveRecord :: IrreversibleMigration 예외를 발생시킵니다. api.rubyonrails.org/classes/ActiveRecord/Migration/…의 메소드 만 change 메소드에 사용해야 합니다.
davekaro

3
Rails 4를 실행 중이며 이전에 이런 종류의 마이그레이션을 수행했습니다. 변경이 작동하지 않습니다! @davekaro의 의견이 정확합니다.
harryt

3
Rails 5의 경우 이것이 정확하고 작동하는 솔루션입니다.
WM

3
반대로 할 때 이전 열 유형을 다시 변경 해야하는 방법을 어떻게 알 수 있습니까?
앤드류 그림

@AndrewGrimm 당신이 맞습니다. 마이그레이션을 취소하려고 할 때 다음과 같이 표시됩니다.This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Marklar

42

Rails 3.2와 Rails 4에서 Benjamin의 인기있는 답변 은 약간 다른 구문을 가지고 있습니다.

터미널에서 먼저 :

$ rails g migration change_date_format_in_my_table

그런 다음 마이그레이션 파일에서

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end

23

있다 change_column의 방법은, 단지 새로운 형식으로 날짜로 마이그레이션을 실행합니다.

change_column(:my_table, :my_column, :my_new_type)

1
원본 데이터를 보존합니까?
BKSpurgeon

1
예, 원본 데이터를 보존하십시오
Mauro

1

AFAIK, 마이그레이션은 스키마를 변경할 때 관심있는 데이터 (예 : 프로덕션)를 재구성하려고 시도합니다. 따라서 그것이 틀린 것이 아니라면 데이터에 신경 쓰지 않는다고 말하면서 원래 마이그레이션에서 날짜와 날짜 시간까지 열 유형을 수정하고 마이그레이션을 다시 실행하는 것이 어떻습니까? (테스트가 있습니다 :)).


2
데이터를 신경 쓰지 않아도 팀에서 작업하고 스키마 변경 사항이 팀의 다른 모든 개발자에게 전파되기를 원하더라도 개발 환경에서 마이그레이션 사용에 대해 잠재적으로 관심을 가질 수 있습니다.
호세 B

이 상황에서 열을 변경하기 위해 추가 마이그레이션을 사용하면 어떤 이점이 있는지 알지 못했습니다. 열을 만든 원래 마이그레이션을 변경하면 무엇이 문제입니까? 두 경우 모두 각 팀 구성원은 새 스키마를 얻기 위해 모든 마이그레이션을 다시 실행해야합니다.
fakeleft

새 마이그레이션을 사용하는 경우 열 유형을 변경 한 마이그레이션을 취소 할 수 있습니다. 원본을 편집하려는 경우 해당 편집을 롤백하고 그 후에 마이그레이션을 다시 실행해야합니다.
재즈 피

이것은 실제로 생산 데이터가 없다는 것을 고려할 때 실제로 매우 신중한 대답입니다. 다른 팀원을 걱정하는 사람들에게는 그게 맞습니다 rake db:migrate:reset.
Ryan McGeary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.