私はRailsにかなり慣れていないので、これを一晩中うまく運ぼうとしていました。
3つのモデルを作成しました:users
、businesses
、および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として使用しています。
まず、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
。それでおしまい。
これに関する現在受け入れられている答えは、データベース外部キーを追加しないため、実際には正確ではありません。整数列を追加するだけです。
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
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移行では、これを「実行」機能に文字列引数として渡すことができます。「実際の」外部キーを追加すると、自動的にインデックスが作成されます。驚き。
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")