はじめに
Rails6.1系を利用しているとある案件開発において、複合主キーを持つ外部DB上の中間テーブルを利用しつつデータ取得をしたいという場面に遭遇しました。
問題点
Rails7.1系であれば複合主キーへの対応が進められているようなのですが、
現在は利用しているのが6.1系という状況でありました。そんなぁ~(;´༎ຶД༎ຶ`)
外部DBへの接続自体は成功しており、同様の設定によってデータ取得自体は出来たのですが、中間テーブルが絡むアクセスパターンにおいて以下のような警告が大量に出て煩わしいといった状況になっていました。
WARNING: Active Record does not support composite primary key.
USER_ROLE_MAPPER has composite primary key. Composite primary key is ignored.
解決方法
以下のように外部DB上のテーブルと対応付けたmodelを設定することでデータ取得時に利用する事が出来、また警告に関してはself.primary_key = nil
を設定する事で表示させないようにすることが出来ました。
class ExternalUserRoleMapper < ApplicationExternalRecord
self.primary_key = nil
self.table_name = 'USER_ROLE_MAPPER'
belongs_to :external_user, foreign_key: 'USER_ID'
belongs_to :external_role, foreign_key: 'ROLE_ID'
end
おわりに
今回はデータ取得のみ、アクセスパターンも極めて限定的で今後増える想定もない。といった状況でしたのでこのような対応に留めたのですが、主キーが絡む操作などが軒並み行えない状態となっています(例えばfind
やlast
メソッド等で例外となる)。そのため、一般的な利用パターンにおいては以下のような対応を検討した方が良いと考えられます。
- composite_primary_keys gemの導入
- Rails7.1系へのアップグレード
参考にさせて頂いた記事など