Rails 4で参照列の移行を追加する 質問する

Rails 4で参照列の移行を追加する 質問する

ユーザーに多数のアップロードがあります。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

すでにテーブルがあり、それらの間に 新しい関係を追加したい場合。usersuploads

必要なのは、次のコマンドを使用して移行を生成することだけです。

rails g migration AddUserToUploads user:references

次のような移行ファイルが作成されます。

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

次に、 を使用して移行を実行します。この移行により、テーブル (テーブル内の参照列) という名前のrake db:migrate新しい列が追加され、さらに新しい列にインデックスも追加されます。user_iduploadsidusers

アップデート [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 ガイド: 外部キーご参考に。

おすすめ記事