普段あまりやらないですが、primary keyをid以外にした時に詰まったのでメモです。
サンプルコード
以下のようにprimary_keyがidではないusersテーブルがあります。
db/schema.rb
# primary_keyがidのusersテーブル
# create_table "users", force: :cascade do |t|
# t.string "name", null: false
# end
# primary_keyをuuidにしたいとき
create_table "users", primary_key: "uuid", id: :string, force: :cascade do |t|
t.string "name", null: false
end
そして、以下のようにarticlesテーブルを作成します。
この際、references
を使うと、primary_keyの指定ができませんでした。
そのため、user_uuid
テーブルとforeign_key
を個別に指定します。
また、うっかりミスなのですが、t.references :user
からt.foreign_key :users
に変える時に、users と、テーブル名に書き換え忘れていました。
class CreateArticles < ActiveRecord::Migration[7.0]
def change
create_table :articles do |t|
- t.references :user, null: false, foreign_key: true
+ t.string :user_uuid, null: false
+ t.foreign_key :users, column: :user_uuid, primary_key: :uuid
t.string :title, null: false
t.text :body, null: false
t.timestamps
+ t.index :user_uuid
end
end
end
また、このままだとuser.articles
を取得しようとした時に、article.user_id
を参照したりしてしまうので、associationの設定も必要です。
以下のようにbelongs_to, has_manyを設定するとuser.articles
, article.user
の設定ができました。
class Article < ApplicationRecord
- belongs_to :user
+ belongs_to :user, primary_key: :uuid, foreign_key: :user_uuid
end
class User < ApplicationRecord
- has_many :articles
+ has_many :articles, foreign_key: :user_uuid
end