[ruby-on-rails] Rails 3 마이그레이션 : 참조 열을 추가 하시겠습니까?

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

rails g migration tester title:tester user:references

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

rails g migration add_user_to_tester user:references

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



답변

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

rails generate migration AddUserRefToProducts user:references

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


답변

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

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

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

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

rails g migration add_user_id_to_tester user_id:integer

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


답변

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

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


답변

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

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


답변

변경 마이그레이션에서 참조를 사용할 수 있습니다 . 이것은 유효한 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


답변

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

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


답변

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

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

add_column :tester, :user_id, :integer

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

class Tester < ActiveRecord::Base
  belongs_to :user
end

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

add_index :tester, :user_id