web-dev-qa-db-ja.com

Railsモデルへの外部キーの追加

私はRailsにかなり慣れていないので、これを一晩中うまく運ぼうとしていました。

3つのモデルを作成しました:usersbusinesses、およびbusiness_hours。関連付けも追加しました(business_hours belongs_to businesses which belongs_to users)および(user has_one business which has_many business_hours)。

オンラインでドキュメントを読むと、DBテーブルにこれらの関係の外部キーを作成する必要があるようです。 Rails ActiveRecordの移行を使用してこれを行うにはどうすればよいですか?PostgreSQLをDBとして使用しています。

37
user470763

まず、belongs_toメソッドを使用する場合は、Wordの最後にsを使用しないでください: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。それでおしまい。

29
Danil Speransky

これに関する現在受け入れられている答えは、データベース外部キーを追加しないため、実際には正確ではありません。整数列を追加するだけです。

Rails 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

Rails 4.xの場合、または新しい列を追加する場合、外部キーにしたい場合は、これを行うことができます、おそらくインデックスをtrueとして指定することもできますが、それは外部キーの要件の一部ではありません。

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
59
Chris

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)

Rails移行では、これを「実行」機能に文字列引数として渡すことができます。「実際の」外部キーを追加すると、自動的にインデックスが作成されます。驚き。

6
Renra

Rails 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")

非標準のデータモデルがある場合は可能です。

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

作成する

 ALTER TABLE "articles" ADD CONSTRAINT fk_Rails_58ca3d3a82 FOREIGN KEY ("author_id") REFERENCES "users" ("lng_id")
5
Ben Edwards