ユーザーに多数のアップロードがあります。uploads
を参照する列をテーブルに追加したいと思いますuser
。移行はどのように行うべきでしょうか?
:user_id, :int
これが私の持っているものです。 (1)と (2) のどちらを使うべきかわかりません:user, :references
。 (2) が機能するかどうかもわかりません。これを「レール」方式で実行しようとしているだけです。
class AddUserToUploads < ActiveRecord::Migration
def change
add_column :uploads, :user_id, :integer
end
end
Rails 3 以外の関連する質問。Rails 3 の移行: 参照列を追加しますか?
ベストアンサー1
レール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
アップデート [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
。
注意:これは参照の追加に加えて行われるため、最初に参照を作成してから外部キーを作成する必要があります(同じ移行ファイルまたは別の移行ファイルで外部キーを作成することもできます)。アクティブ レコードは単一列の外部キーのみをサポートしており、現在はmysql
、、mysql2
およびPostgreSQL
アダプタのみがサポートされています。、などの他のアダプタではこれを試さないでください。sqlite3
を参照してください。Rails ガイド: 外部キーご参考に。