Rails 4.x
テーブルがすでにあり users
、それらの間に新しい関係uploads
を追加したい場合。
次のコマンドを使用してマイグレーションを生成するだけです。
rails g migration AddUserToUploads user:references
次のように移行ファイルが作成されます:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
次に、を使用して移行を実行しrake db:migrate
ます。この移行ではuser_id
、uploads
テーブルに名前が付けられた新しい列(テーブルのid
列を参照users
)が追加されます。さらに、新しい列にインデックスが追加されます。
UPDATE [For Rails 4.2]
参照整合性を維持するためにRailsを信頼することはできません。ここでリレーショナルデータベースが役立ちます。つまり、データベースレベル自体に外部キー制約を追加し、このセットの参照整合性に違反する操作をデータベースが確実に拒否できるようにすることができます。@infogetがコメントしたように、Rails 4.2には外部キーのネイティブサポートが付属しています(参照整合性)。。必須ではありませんが、上記で作成した参照に外部キーを追加することもできます(非常に便利なため)。
外部キーを既存の参照に追加するには、新しい移行を作成して外部キーを追加します。
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
外部キーを使用して完全に新しい参照を作成するには(Rails 4.2)、次のコマンドを使用して移行を生成します。
rails g migration AddUserToUploads user:references
移行ファイルは次のように作成されます。
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
これuser_id
により、uploads
テーブルの列に新しい外部キーが追加されます。キーid
はusers
テーブルの列を参照します。
注:これは参照の追加に追加されるため、最初に参照を作成してから外部キーを作成する必要があります(同じ移行または別の移行ファイルで外部キーを作成することを選択できます)。Active Recordは単一列の外部キーのみをサポートし、現在はmysql
、mysql2
およびPostgreSQL
アダプターのみがサポートされています。sqlite3
などの他のアダプタでこれを試さないでください。参考のために、Railsガイド:外部キーを参照してください。