기존 Rails 열에서 부울에 : default => true 추가


160

기존 열에 기본 부울 값을 추가하는 방법에 대한 몇 가지 질문 (즉, this )을 보았습니다 . 그래서 나는 change_column제안을 시도했지만 제대로하지 않아야합니다.

나는 시도했다 :

$ change_column :profiles, :show_attribute, :boolean, :default => true

어떤 반환 -bash: change_column: command not found

나는 다음을 달렸다.

$ rails g change_column :profiles, :show_attribute, :boolean, :default => true

...과

$ rails change_column :profiles, :show_attribute, :boolean, :default => true

그런 다음 실행 rake db:migrate했지만 값은 :show_attribute그대로 유지되었습니다 nil. 위에서 언급 한 질문에서 PostgreSQL에서는 수동으로 업데이트해야한다고 말합니다. PostgreSQL을 사용하고 있기 때문에 create_profiles마이그레이션에 다음을 추가했습니다 .

t.boolean :show_attribute, :default => true

누군가 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있습니까?

답변:


314

change_column의 메소드 ActiveRecord::Migration이므로 콘솔에서와 같이 호출 할 수 없습니다.

이 열에 기본값을 추가하려면 새 마이그레이션을 작성하십시오.

rails g migration add_default_value_to_show_attribute

그런 다음 마이그레이션에서 생성되었습니다.

# That's the more generic way to change a column
def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

def down
  change_column :profiles, :show_attribute, :boolean, default: nil
end

또는 더 구체적인 옵션 :

def up
    change_column_default :profiles, :show_attribute, true
end

def down
    change_column_default :profiles, :show_attribute, nil
end

그런 다음을 실행하십시오 rake db:migrate.

이미 생성 된 레코드로는 아무것도 변경되지 않습니다. 그러기 위해서는 rake task또는 rails console레코드 를 작성하고 모든 레코드를 업데이트해야합니다 (제작에서는 권장하지 않음).

당신이 추가 할 때 t.boolean :show_attribute, :default => true받는 create_profiles마이그레이션,이 아무 짓도 안 했어요 것으로 예상합니다. 아직 실행되지 않은 마이그레이션 만 실행됩니다. 새로운 데이터베이스로 시작한 경우 기본값이 true로 설정됩니다.


2
해당 change_column 호출은 up마이그레이션 의 메소드에 있어야합니다. 이는 db / migrate /에서 생성 될 새 클래스입니다. (이 down방법은 실행을 취소하도록 작성해야합니다 up.) 그런 다음 변경하십시오 rake db:migrate.
rkb

아, rkb가 더 의미가 있습니다. 감사!
tvalent2

내가 쓴 때까지 나를 위해 작동하지 않는 def self.updef self.down
카밀 Szot

아마도 이전 버전의 레일을 사용하고있을 것입니다. 이 구문은 3.1 이후부터 있다고 생각합니다.
Robin

그리고 Rails 5에서는 _attribute를 생략 show하여 열 이름이 무엇이든 말해야 합니다.
미로

95

허용되는 답변의 변형으로 change_column_default마이그레이션에서이 방법을 사용할 수도 있습니다 .

def up
  change_column_default :profiles, :show_attribute, true
end

def down
  change_column_default :profiles, :show_attribute, nil
end

Rails API 문서


1
이것은 당신이 실수로 다른 컬럼의 속성을 변경하지 않습니다 보장합니다
Brian Low

1
Rails 5에서는 _attribute를 생략하므로 show열 이름이 무엇이든 말해야 합니다.
미로

1
@labyrinth 무슨 뜻인가요? show_attribute 이다 컬럼의 이름은, 내가 5, 바로 그와 아무 상관이 레일을 생각하지 않아?
로빈

34

이것이 언제 작성되었는지 확실하지 않지만 현재 마이그레이션의 열에서 기본값을 추가하거나 제거하려면 다음을 사용할 수 있습니다.

change_column_null :products, :name, false

레일 5 :

change_column_default :products, :approved, from: true, to: false

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

레일스 4.2 :

change_column_default :products, :approved, false

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

열 사양에 대한 마이그레이션 또는 스키마를 살펴 보지 않는 깔끔한 방법입니다.


Rails 5 문서에서 온 것입니다. 이것의 Rails 4.2 버전은 해시를 받아들이지 않지만 세 번째 매개 변수로 정확히 새로운 기본값을 허용합니다. guides.rubyonrails.org/v4.2/…
Clamoris

레일에 대하여 5,하고 둘 다 가장 올바른 방법이, 예를 들어 보인다 null: falsedefault: :something기본적으로
도리안


1

마이그레이션을 방금 수행 한 경우 롤백 한 후 다시 마이그레이션 할 수 있습니다.

롤백하려면 원하는만큼 많은 단계를 수행 할 수 있습니다.

rake db:rollback STEP=1

또는 Rails 5.2 이상을 사용하는 경우 :

rails db:rollback STEP=1

그런 다음 마이그레이션을 다시 수행하면됩니다.

def change
  add_column :profiles, :show_attribute, :boolean, default: true
end

잊지 말고 rake db:migrate헤 로쿠를 사용하는 경우heroku run rake db:migrate



0

Rails Console에서 최근의 작은 변경 사항에 대해 다른 마이그레이션 파일을 작성하지 않으려면 다음을 수행하십시오.

ActiveRecord::Migration.change_column :profiles, :show_attribute, :boolean, :default => true

그런 다음 레일 콘솔을 종료했다가 다시 입력하면 DB-Changes가 영향을받습니다. 그런 다음이 작업을 수행하면 ...

Profile.new()

"show_attribute"기본값이 true로 표시되어야합니다.

기존 레코드의 경우 기존 "false"설정을 유지하고 "nil"값만 새 기본값으로 업데이트하려는 경우 :

Profile.all.each{|profile| profile.update_attributes(:show_attribute => (profile.show_attribute == nil ? true : false))  }

이 테이블을 생성 한 마이그레이션을 업데이트하여 향후 DB 빌드를 시작하면 바로 시작할 수 있습니다. 또한 DB의 배포 된 인스턴스에서 동일한 프로세스를 실행하십시오.

"새 DB 마이그레이션"방법을 사용하는 경우 해당 마이그레이션에서 기존의 0이 아닌 값을 업데이트 할 수 있습니다.

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