[Rails] 主キーがid以外のテーブルを外部キーに設定する方法

単に探し方が悪かっただけかもしれませんが、解決に苦労したのでメモを残しておこうと思います。

1. 主キーがid以外のテーブルを作成



db/migrate/xxxx_create_projects.rb
class CreateProjects < ActiveRecord::Migration[5.1]
  def change
    create_table :projects, id: false do |t|
      t.string :project_id, primary_key: true, limit: 10
      t.string :projectname

      t.timestamps
    end
  end
end

create_table の所で、id : false を設定して、項目 id が作成されないようにします。
項目 project_id は、string型で、limit:10 を設定したことで、varchar(10)で登録されます。 primary_key: true を設定することで、ちゃんと主キーになってます。

2. 外部キーを設定

テーブル :testids の項目 :project_id に対し、テーブル : projects、主キー:project_id を、外部キーに設定する。

db/migrate/xxxx_create_testids.rb
class CreateTestids < ActiveRecord::Migration[5.1]
  def change
    create_table :testids do |t|
      t.references :project,  type: :string , limit: 10
      t.string :testphase, limit: 3
      t.string :testname
      t.date   :startdate
      t.date   :enddate

      t.timestamps
    end
    add_foreign_key :testids, :projects, colmun: :project_id , primary_key: :project_id
  end
end

t.references  を使うと、xxx_idの項目が登録されるそうです。
(ここでは、projectを指定しているので、項目: project_idが登録される)
項目の型は、初期値が数値型のようなので、type: :string で、string型にして、limit: 10 で10文字に制限をしてます。

テーブルを生成後に、add_foreign_keyで外部キーを追加してます。

add_foreign_key :testids(参照元テーブル), :projects(参照先テーブル), column: :project_id(参照元テーブルの項目), primary_key: :project_id(参照先テーブルの主キー)


このやり方が正しいか分かりませんが、想定通りの設定は行われてます。








 

コメント

このブログの人気の投稿

[Music] DTM初心者のためのドラム打ち込み その2

[Swift] StoryBoardを使用しない - UITextFieldで編集不可にする方法

[Swift] UISliderをカスタマイズしてみる