예를 들어 다음과 같이 새 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