Rails 3 마이그레이션 : 참조 열을 추가 하시겠습니까?


162

예를 들어 다음과 같이 새 Rails 3 마이그레이션을 생성하면

rails g migration tester title:tester user:references

, 모든 것이 잘 작동합니다 ... 그러나 열을 따라 뭔가가있는 열을 추가하면 :

rails g migration add_user_to_tester user:references

참조 필드가 인식되지 않습니다. 간단히 말해서 문제는 명령 줄에서 레일 마이그레이션에 참조 열을 어떻게 추가합니까?

답변:


205

Rails 4.x 를 사용하는 경우 이제 다음과 같이 참조를 사용하여 마이그레이션을 생성 할 수 있습니다.

rails generate migration AddUserRefToProducts user:references

레일 가이드에서 볼 수 있듯이


1
예를 들어 edgeguides.rubyonrails.org/active_record_migrations.html의 섹션 2.1을 참조하십시오 .
B 세븐

2
자동 생성 이름 대신 외래 키의 열 이름을 어떻게 지정합니까?
j는

@j는 다형성을 사용할 수 있습니다 : user : references {polymorphic}.
Paulo Fidalgo

@PauloFidalgo 어떻게해야하는지 조금 설명해 주시겠습니까? 링크의 가이드가 될 수 있습니까? (다형성에 대해 이야기)
Anwar


186

편집 : 이것은 오래된 답변이므로 신청해서는 안됩니다. Rails 4.x 이상에는

참조 된 클래스에 정수 ID를 사용할 수있는 경우 참조를 추가 할 필요가 없습니다.

일반 정수 대신 참조를 사용하면 모델이 belongs_to로 미리 정의되고 모델이 이미 생성되어 기존 항목을 마이그레이션해도 영향을받지 않기 때문에 그 목적이 사라진다는 장점이 있습니다.

그래서 나는 이것을 이렇게 좋아할 것입니다 :

rails g migration add_user_id_to_tester user_id:integer

그런 다음 테스터 모델에서 수동으로 belongs_to : user를 추가하십시오


9
그러나 이것이 그것을 지원하는 데이터베이스에 적절한 외래 키 제약 조건을 만들지 않을 것입니다.
abahgat

19
아닙니다. afaik Rails는 플러그인을 추가하지 않으면 데이터베이스에 외래 키 제한을 만들지 않습니다.
DanneManne

그냥이 게시물을 공부, pls 어떻게 내가 나중에 참조를 추가합니까
El nino

13
사용자와 인덱스를 추가해야합니다 : 정수 : 인덱스
rickypai

3
대답은 날짜가 있습니다. 현대 레일에 대해서는 @Paulo의 대답을 참조하십시오.
OneHoopyFrood

102

해당 열에 대한 색인도 필요할 것입니다.

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end

1
왜? 대부분의 belongs_to 관계에 해당 되는가?
ahnbizcad

실제로 성능상의 이유이며, belongs_to 관계의 다른쪽에 has_many / has_one이 있으면 편리합니다. 당신이 통과하지 않을 것을 절대적으로 확신한다면 user.testers색인을 생략 할 수 있습니다.
유진

1
rails g migration ...생성 add_reference :installs, :device, index: true또한 인덱스를 생성한다.
B 세븐

49

위에서 언급 한 두 가지 단계를 수행해도 여전히 외래 키 제약 조건이 없습니다. 이것은 작동해야합니다 :

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end

이것이 유일한 실제 답변입니다. 외부 키는 여기에 가장 중요한 부분이다
user2490003

질문이 레일 3을 요구하기 때문에 정답으로 표시되어야합니다.
Carlos Roque

35

변경 마이그레이션에서 참조를 사용할 수 있습니다 . 이것은 유효한 Rails 3.2.13 코드입니다.

class AddUserToTester < ActiveRecord::Migration
  def change
    change_table :testers do |t|
      t.references :user, index: true 
    end
  end
  def down
    change_table :testers do |t|
      t.remove :user_id
    end
  end
end

cf : http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


1
방법 변경 및 다운? 위와 아래 방법이 아닌가?
MaicolBen

@MaicolBen 예, 다운 방법을 사용하지 않아도됩니다.
Hut8

@MaicolBen down방법이 없으면 ActiveRecord::IrreversibleMigrationRails 3.2를 사용하여 롤백 할 때 얻었습니다 . 또한로 변경 change해야했습니다 up.
Andrew Grimm

27

실행 rails g migration AddUserRefToSponsors user:references하면 다음과 같은 마이그레이션이 생성됩니다.

def change
  add_reference :sponsors, :user, index: true
end

이 버전의 Rails는 무엇입니까?
Andrew Grimm

8

열을 추가 할 때 해당 열을 정수로 만들고 가능하면 레일 규칙을 따르십시오. 따라서 귀하의 경우 이미 테스터 및 사용자 모델과 테스터 및 사용자 테이블이 있다고 가정합니다.

외래 키를 추가하려면 user_id (컨벤션)라는 이름의 정수 열을 만들어야합니다.

add_column :tester, :user_id, :integer

그런 다음 belongs_to를 테스터 모델에 추가하십시오 :

class Tester < ActiveRecord::Base
  belongs_to :user
end

그리고 외래 키에 대한 색인을 추가하고 싶을 수도 있습니다 (이것은 참조가 이미 당신을 위해하는 것입니다).

add_index :tester, :user_id

8

그 트릭을 할 것입니다 :

rails g migration add_user_to_tester user_id:integer:index

나는 이것이 또한 당신이 가장 원하는 색인을 추가한다는 것을 좋아합니다.
bheeshmar

3

다음과 같은 방법으로 명령 행을 통해 모델에 참조를 추가 할 수 있습니다.

rails g migration add_column_to_tester user_id:integer

다음과 같은 마이그레이션 파일이 생성됩니다.

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

내가 사용할 때마다 잘 작동합니다 ..


3

레일 4

생성기는 열 유형을 참조로 허용합니다 ( belongs_to ).

이 마이그레이션은 user_id열과 적절한 색인을 만듭니다 .

$ rails g migration AddUserRefToProducts user:references 

생성합니다 :

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

레일 3

도우미는 참조라고도합니다 (라고도 함 belongs_to).

이 마이그레이션은 category_id적절한 유형 의 열을 생성합니다 . 열 이름이 아닌 모델 이름을 전달합니다. 액티브 레코드가 _id당신을 위해 추가합니다 .

change_table :products do |t|
  t.references :category
end

다형성 belongs_to연관이있는 경우 참조는 필요한 두 열을 모두 추가합니다.

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

attachment_id 열과 attachment_type기본값이 기본값 인 문자열 열을 추가합니다.Photo .

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration

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