2013-04-27 3 views
28

저는 레일에 새로운 것이므로 밤새 운 좋게도이 작업을 해보려고 노력하고 있습니다.레일 모델에 외래 키 추가하기

나는 users, businessesbusiness_hours의 3 가지 모델을 만들었습니다. 또한 협회 (business_hours belongs_to businesses which belongs_to users)와 (user has_one business which has_many business_hours)을 추가했습니다.

문서를 온라인으로 읽는 것은 이제 내 DB 테이블에서 이러한 관계에 대한 외래 키를 만들어야하는 것 같습니다. Rails ActiveRecord 마이그레이션을 사용하여 어떻게해야합니까? 내 DB로 PostgreSQL을 사용하고 있습니다.

답변

23

우선 belongs_to 메소드를 사용하면 단어 끝에 을 사용하지 마십시오. business_hours belongs_to business which belongs_to user.

이제 마이그레이션을 만듭니다

rails generate migration migration_name 

및 마이그레이션에

는 열을 추가 :

class MigrationName < ActiveRecord::Migration 
    def change 
    add_foreign_key :business_hours, :businesses 
    add_foreign_key :businesses, :users 
    end 
end 

실행 rake db:migrate합니다. 그게 전부 야.

+0

가 나는 또한 사용자에게 비즈니스에 business_id 열 및 USER_ID 열을 추가해야 생성

add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id" 

? –

+0

확인. db : migrate를 실행할 때 다음 오류가 발생합니다. PG :: Error : ERROR : relation "business"가 존재하지 않습니다. –

+0

def change 메소드에서 오류가 발생했습니다. 당신의 도움을 주셔서 감사합니다! –

5

PostgreSQL을 사용해 보지는 않았지만 적어도 MySQL Rails에서는 외래 키를 만들지 않습니다. 실제 db 수준의 외래 키는 아닙니다. 그들이 만드는 모든 것은 규약에 따라 명명 된 정수입니다. 즉, 상자 밖에서는이 가짜 외래 키에 대한 색인을 얻지 않으며 (빠른 조회를 위해) db 수준의 참조 무결성 검사도 없습니다. 이를 얻으려면 다음과 같이해야합니다 :

ALTER TABLE your_table ADD CONSTRAINT fk_whatever_you_want_to_name_it FOREIGN KEY (foreign_key_name) REFERENCES another_table(its_primary_key) 

레일스 마이그레이션에서 이것을 "실행"함수의 문자열 인수로 전달할 수 있습니다. "실제"외래 키를 추가하면 자동으로 색인이 생성됩니다. 적어도 나를 위해 이것은 약간 더러운 놀람이었다.

+0

이것은 나에게 뉴스 다. 다른 누군가가 그것에 대해 의견을 말하기를 바랍니다. 실제로 이것은 다소 불쾌한 일입니다. 나는 Postgres를 사용하고 pgAdmin의 테이블을보고 외래 키로 나열되지도 않는다. Rails 전용 프로젝트에서는 괜찮을 지 모르지만 데이터베이스에 액세스하기 위해 다른 프로그램이 필요한 경우 어떻게해야합니까? – tentimes

+0

조금 더 심해지지만 그 뒤에 이유가 있다는 것도 배웠습니다. 레일스는 가능한 한 많이 db에서 추상화하려고 노력하므로 persistence 레이어를 쉽게 전환 할 수 있습니다. 그러나 나는 그것이 충분히 강조되지 않은 것이라고 생각합니다. 원하는 경우 외래 키로 사용할 필드에서 항상 add_index를 사용할 수 있습니다. 또는 SQL에서 마이그레이션을 작성하거나 레일스가 외래 키를 어떻게 든 수행하도록 만들 수도 있습니다. 하지만 레일이 처음부터 그렇게하지 않는다는 것을 모르는 경우에는 할 일이없는 것입니다. 그것은 실제로 의미가 있습니까? :-) – Renra

+0

실제로 이것을 고치기 위해 외국인이라고 불리는 보석이 있다는 것을 알았습니다! 또한 이민자라고 불리는 추가 기능의 보석이있어 전체 데이터베이스에서 사용할 수 있습니다. 인덱스를 추가하면 뭔가가 외래 키로 표시됩니까? 나는 몰랐다 - 나는 레일에 처음이다.) – tentimes

54

데이터베이스의 외래 키를 추가하지 않기 때문에 현재로서는이 답변이 정확하지 않습니다. 그냥 정수 열을 추가하는 것입니다.

레일 4.2.x를에서, 현재의 접근 방식은 다음과 같습니다

http://guides.rubyonrails.org/active_record_migrations.html#foreign-keys

는 마이그레이션 만들기 : 기존 열를 들어

rails generate migration migration_name 

를 마이그레이션에서 외래 키 추가 이렇게 :

class MigrationName < ActiveRecord::Migration 
    def change 
    add_foreign_key :business_hours, :businesses 
    add_foreign_key :businesses, :users 
    end 
end 
레일 4.x의 또는를 들어

당신은 새 열을 추가하고 당신이 당신이 아마 또한 인덱스를 지정하는 등 진정한 원하는 곳을, 할 수있는 외래 키가되고 싶어요,하지만 그 부분이 아니다하는 경우 외래 키에 대한 요구 사항의 지금

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

class MigrationName < ActiveRecord::Migration 
    def change 
    add_reference :business_hours, :business, index: true, foreign_key: true 
    add_reference :businesses, :user, index: true, foreign_key: true 
    end 
end 
+1

이 크리스 공유 주셔서 감사합니다. 나는 이것을 알아 내기 위해 온통 보았다. – mack

+0

이 문제의 해결책을 찾았을 때 기대했던 것입니다. – Ratinahirana

+1

그런 외래 키 열의 이름을 지정하는 방법이 있습니까? 이미 특정 레코드에 여러 레코드가있는 상황이있었습니다. 즉, (sourceClass, targetClass, fieldName)을 볼 것으로 예상되지만, 위 예제에는 (sourceClass, targetClass) 만 포함되어있는 것 같습니다. 아무에게도 이것에 대한 정보가 있습니까? –

2

레일 5 마이그레이션에서 외래 키를 추가 할 수 http://devdocs.io/rails~5.0/activerecord/connectionadapters/schemastatements#method-i-add_foreign_key를 참조하십시오.당신은 당신이 할 수있는 비 표준 데이터 모델을 사용하는 경우에는 그래서

add_foreign_key :articles, :authors 

ALTER TABLE "articles" ADD CONSTRAINT fk_rails_e74ce85cbc FOREIGN KEY ("author_id") REFERENCES "authors" ("id") 

을 만듭니다. 그들은 이미이없는 경우

ALTER TABLE "articles" ADD CONSTRAINT fk_rails_58ca3d3a82 FOREIGN KEY ("author_id") REFERENCES "users" ("lng_id")