Rails (というか Active Record) のマイグレーションで複合外部キーを設定する方法

結論

生SQLを書くしかなさそう。

具体例

usersテーブルとitemsテーブルを、column_1column_2のキーで結びつける場合です。複合主キーとなるのはitemsテーブルの方です。

class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :column_1
      t.string :column_2
      t.string :column_3
      t.string :column_4

      t.timestamps
    end

    # 複合外部キーを設定するのはこうするしかなさそう……
    sql = 'ALTER TABLE users ADD FOREIGN KEY (column_1, column_2) REFERENCES items (column_1, column_2);'
    ActiveRecord::Base.connection.execute(sql)
  end
end

補足

3時間ぐらい調べまくったけれども書き方が見つからなかった。もちろん調べ方が悪い、足りない可能性もあるけど、以下のように Rails 自体の思想であるとのこと*1なので、やはり無いのかなと思った。

あと、これぐらいなら手動でさっさと書くほうが早かった。

当然

グレーノウハウっぽい気がするので、どなたかご存知でしたら教えてください。やっぱり中間テーブル使うのがセオリーなのかなと。

バージョン

$ bundle exec ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
$ bundle exec rails -v
Rails 5.1.1

補足(追記)

*1:8年前の記事だけれども

Powered by はてなブログ