[Rails] 主キーがid以外のテーブルを外部キーに設定する方法
単に探し方が悪かっただけかもしれませんが、解決に苦労したのでメモを残しておこうと思います。
db/migrate/xxxx_create_projects.rb
create_table の所で、id : false を設定して、項目 id が作成されないようにします。
項目 project_id は、string型で、limit:10 を設定したことで、varchar(10)で登録されます。 primary_key: true を設定することで、ちゃんと主キーになってます。
db/migrate/xxxx_create_testids.rb
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(参照先テーブルの主キー)
このやり方が正しいか分かりませんが、想定通りの設定は行われてます。
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(参照先テーブルの主キー)
このやり方が正しいか分かりませんが、想定通りの設定は行われてます。
コメント
コメントを投稿