1. ホーム
  2. ruby-on-rails

[解決済み】Rails 4で参照列のマイグレーションを追加する

2022-03-25 11:49:34

質問

あるユーザーがたくさんのアップロードをしています。このような場合、カラムを uploads テーブルを参照し user . 移行はどのようにすればよいのでしょうか。

私が持っているのはこんな感じです。私は、(1)を使用すべきかどうか迷っています。 :user_id, :int または(2) :user, :references . (2)がうまくいくかどうかもわからない。ただ、これを"rails"方式でやってみようとしただけです。

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

Rails 3 以外の関連質問です。 Rails 3 のマイグレーション。参照列を追加する?

解決方法は?

Rails 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_id から uploads テーブル(参照 id の列を users テーブル)、PLUSは新しいカラムにインデックスを追加します。

UPDATE [Rails4.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 テーブルを作成します。

NOTE これは、リファレンスを追加することに加えてなので、やはり まず参照を作成し、次に外部キーを作成します。 ( 外部キーは、同じマイグレーションで作成するか、別のマイグレーションファイルで作成するかを選択できます。 ). Active Record は単一カラムの外部キーしかサポートしておらず、現在は mysql , mysql2PostgreSQL アダプタがサポートされています。のような他のアダプタでは試さないでください。 sqlite3 など。参照 Railsのガイドです。外部キー を参照してください。