마이그레이션을 통해 열에 기본값 추가


276

마이그레이션을 통해 이미 존재하는 열에 기본값을 어떻게 추가합니까?

내가 찾을 수있는 모든 문서는 열이 존재하지 않지만이 경우에는 수행하는 방법을 보여줍니다.

답변:


352

수행 방법은 다음과 같습니다.

change_column :users, :admin, :boolean, :default => false

그러나 PostgreSQL과 같은 일부 데이터베이스는 이전에 작성된 행의 필드를 업데이트하지 않으므로 마이그레이션시 필드를 수동으로 업데이트해야합니다.


14
가역 마이그레이션이 필요한 경우이를 up블록이 아닌 블록에 넣으십시오 change. down블록을 비워 둘 수 있습니다 . 테이블을 원래 상태로 되 돌리지 않지만 마이그레이션을 롤백 할 수 있습니다.
IAmNaN

1
데이터가 그대로 유지됩니까?
Marco Prins

2
PostgreSQL에서 예, 다른 데이터베이스에서 어떤 일이 일어날 지 모르겠습니다.
Maurício Linhares

1
"마이그레이션시 필드를 수동으로 업데이트해야합니다"라는 말의 의미는 무엇입니까? 어떻게합니까?
David Argyle Thacker

7
PostgreSQL에서 시도하고 이전에 만든 필드를 업데이트했습니다.
Aboozar Rajabi

190
change_column_default :employees, :foreign, false

1
@DenisLins 나는 당신과 동의했기 때문에 왜 그렇지 않을지 알아 내기 위해 조사를했으며 특정 데이터베이스 어댑터가 그것을 지원하지 않을 가능성이 있음이 밝혀졌습니다. 수락 된 답변은 여전히 ​​추상적 모델로 구현 될 때까지 가장 안전한 방법입니다. apidock.com/rails/ActiveRecord/ConnectionAdapters/…
natchiketa

5
게다가, 당신은 a를 지정해야 from:하고 to:만약 그것을 뒤집을 수 있기를 원한다면 :)
radubogdan

5
이 커밋에서 Rails 5 이상에서 사용 from하고 to추가되었습니다 : github.com/rails/rails/pull/20018/files
Joshua Pinter

115

들어 레일 4+ 사용change_column_default

def change
  change_column_default :table, :column, value
end

1
열을 추가하고 기존 레코드의 기본값을 설정하는 마이그레이션이있는 경우 특히 유용합니다. 예를 들어 def change `add_column : FOOS, 이름, 기본 :``change_column_default "기존 값에 대한 뭔가", FOOS, 이름, 기본 : ""`end
user1491929

2
이 이주에는 이상한 행동이 있습니다. 귀하의 예에서는 돌이킬 수 없습니다. edgeguides.rubyonrails.org/active_record_migrations.html 다음과 같은 방법으로 사용하는 것이 좋습니다. change_column_default :products, :approved, from: true, to: false—하지만 작동하지 않습니다.
Ilya Krigouzov

그것을 사용하여 롤백 할 수 없습니까?
aldrien.h 2012

거의 모든 "변경"절에 대해 일반적으로 그렇습니다. 열의 존재 여부, 유형 등과 같이 이전의 모든 상태는 일반적으로 명시 적이므로 변경 사항은 해당 항목이있는 경우에만 표시되는대로 롤백 할 수 있습니다. 이전에 유효한 명시 적 기본값입니다. 기본값이 정의되어 있지 않은 것이 일반적이므로 문제가있을 수 있습니다.
Elindor

48

사용 def change은 되돌릴 수있는 마이그레이션을 작성해야 함을 의미합니다. 그리고 change_column뒤집을 수 없습니다. change_column돌이킬 수는 없지만 돌이킬 수는 없습니다 .

그것은 몇 여분의 라인을있을 수 있지만 대신, 당신은 사용해야 def up하고def down

따라서 기본값이없는 열이 있으면이를 수행하여 기본값을 추가해야합니다.

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: nil
end

또는 기존 열의 기본값을 변경하려는 경우.

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: true
end

37

** 4.X + 레일

Rails 4부터 기본값을 사용하여 테이블에 열을 추가하기 위해 마이그레이션을 생성 할 수 없습니다 . 다음 단계는 기본값이 true 또는 false 인 기존 테이블에 새 열을 추가합니다.

1. 명령 행에서 마이그레이션을 실행하여 새 열을 추가하십시오.

$ rails generate migration add_columnname_to_tablename columnname:boolean

위의 명령은 테이블에 새 열을 추가합니다.

2. 작성된 새 이주 파일을 편집하여 새 열 값을 TRUE / FALSE로 설정하십시오.

class AddColumnnameToTablename < ActiveRecord::Migration
  def change
    add_column :table_name, :column_name, :boolean, default: false
  end
end

**삼. 애플리케이션 데이터베이스 테이블을 변경하려면 터미널 **에서 다음 명령을 실행하십시오.

$ rake db:migrate

레일 3+ 또는 2+와 다른 점은 무엇입니까?
Ruby Racer

2
이것이 Rails 5에 통합되었는지 아는 사람이 있습니까?
sambecker

9

실행 :

rails generate migration add_column_to_table column:boolean

이 마이그레이션을 생성합니다.

class AddColumnToTable < ActiveRecord::Migration
  def change
    add_column :table, :column, :boolean
  end
end

: default => 1을 추가하여 기본값을 설정하십시오.

add_column : table, : column, : boolean, : default => 1

운영:

레이크 db : 마이그레이션


2
이제 1의 기본 값은 정확히 부울 아니다) 또한,이 exampe을 추가 하는 대신 영업 이익 달성하고 싶었다 것입니다 기존의 열 변화의 새로운 열을
radiospiel

@radiospiel 사실, 1도 부울입니다 :)
kinduff

또한이를 방지하려면 ID가 1 인 외래 키 테이블에 레코드를 작성해야합니다 Key is not present in table error.
약속 Preston

-50

이것이 당신이 할 수있는 일입니다 :

class Profile < ActiveRecord::Base
  before_save :set_default_val

  def set_default_val
    self.send_updates = 'val' unless self.send_updates
  end
end

편집 : ...하지만 분명히 이것은 신인 실수입니다!


스키마에서 기본값을before_save
rigelstpierre

6
어떤 끔찍한 제안
svelandiag

동의, 정말 끔찍하다
Houcheng

3
물론 데이터베이스 수준 대신 모델 수준에서 무언가를 수행하기 위해 많은 열이 있습니다. -38은 전설적인 점수입니다.
nurettin

1
무슨 신인 실수 ... ;-)
webaholik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.