4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【学習備忘録】アウトプットの習慣化を目指したいAdvent Calendar 2023

Day 14

【Rails】外部DB上の複合主キーを持つテーブルのデータ取得をしてみた

Posted at

はじめに

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を設定する事で表示させないようにすることが出来ました。

app/models/external_test.rb
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

おわりに

今回はデータ取得のみ、アクセスパターンも極めて限定的で今後増える想定もない。といった状況でしたのでこのような対応に留めたのですが、主キーが絡む操作などが軒並み行えない状態となっています(例えばfindlastメソッド等で例外となる)。そのため、一般的な利用パターンにおいては以下のような対応を検討した方が良いと考えられます。

参考にさせて頂いた記事など

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?