BackEnd

Railsで複合主キーのテーブルを扱う

投稿日:

はじめに

RailsでWebサービスを開発する際のDB設計では基本的にidが主キーになると思います。
ただし、複合主キーのテーブルを扱わなければならないケースも稀にあります(先日遭遇しました)ので、Railsで複合主キーのテーブルを扱う方法を紹介します。

前提条件

  • Ruby (2.4.1)
  • Rails (5.1.4)
  • composite_primary_keys (10.0.2)

実装例

複合主キーのテーブルをActiveRecordで扱いやすくするために「composite_primary_keys」というGemを利用します。
https://github.com/composite-primary-keys/composite_primary_keys

config

config/environments/development.rbの末尾に以下の一行を追加します。

マイグレーション

childrenテーブルとparentsテーブルを例として実装を見ていきます。

「primary_key: %w(name school_year class_num)」で主キーを指定している以外は普通のマイグレーションファイルだと思います。
この場合「id」のカラムは追加されません。

モデル

続いてモデルの実装を見ていきます。

上記の通り「self.primary_keys = :name, :school_year, :class_num」で主キーを指定してやる必要があります。
外部キーを指定してやることで「belongs_to」や「has_many」などもいつもどおり使えます。
「new」や「save」などもいつもどおり使えますが「find」は条件をカンマ区切りで指定してやる必要があります。
Child.find('Ichiro Yamada,1,1')
※検索条件に文字列が含まれる場合は全て文字列で記述します。

さいごに

実際のサービス開発では複合主キーは使わないほうがいいかもしれませんが、参考になれば幸いです。

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

PHPerだけどKotlinを勉強したって良いよね その2〜コンストラクタ編〜

1 はじめに2 コンストラクタ2.1 プライマリコンストラクタ2.2 セカンダリコンストラクタ2.3 ニックネームのみを入力した人2.4 ニックネームと email を入力した人2.5 Faceboo ...

icon

PHP、Ruby、Pythonのfor構文を比較してみた

1 はじめに1.1 環境2 ドキュメント2.1 PHP2.2 Ruby2.3 Python3 1から100まで出力してみる3.1 PHP3.2 Ruby3.3 Python4 リスト型(配列)の出力4 ...

Stripe Connectでダイレクト支払い導入編

1 はじめに2 事前準備3 StripeConnectの導入3.1 stripeパッケージの導入3.2 envの実装4 店舗アカウントの登録4.1 Stripe Connectの設定4.2 Oauth ...

GraphQL

いまさら学ぶGraphQL〜概要編〜

1 はじめに2 GraphQLとは?2.1 なぜGraphQLは誕生した?2.1.1 過剰な取得2.1.2 過少な取得2.1.3 エンドポイントの管理3 GraphQLのメリットとデメリット3.1 G ...

laravel logo

Laradock環境にPHPStormからXdebugする

1 はじめに2 Laradock側の設定変更2.1 xdebug.iniファイル2.2 .env2.3 コンテナの再構築3 PHPStormの設定3.1 Preferences3.1.1 Build, ...

フォロー

blog-page_side_responsive

2018年6月
 12
3456789
10111213141516
17181920212223
24252627282930

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。