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')
※検索条件に文字列が含まれる場合は全て文字列で記述します。

さいごに

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

page_footer_300rect




page_footer_300rect




-BackEnd
-

執筆者:


comment

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

CAPTCHA


関連記事

rails

Rails Developer Meetup に参加してきました【1日目】

1 はじめに2 発表について2.1 安全かつ高速に進めるマイクロサービス化2.2 Rails in Microservices2.3 MySQL/InnoDB の裏側2.4 H2O/mruby でつく ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

rails

Active Strageを使用してユーザーのアバターを登録、表示する

1 はじめに1.1 環境2 セットアップ2.1 前準備2.2 マイグレーションファイル作成2.3 設定ファイル3 実際に使って見る3.1 モデル3.2 コントローラー3.3 ビュー4 個人的メモ4.1 ...

rails

RailsでAjax処理で画面を更新する

1 はじめに2 View(遷移元)の設定3 Controllerの実装4 View(遷移先)の実装5 参考6 さいごに はじめに RailsでAjax処理で画面を更新する方法を簡単に紹介します。 Vi ...

aws

ALB+EC2な環境でhttpをhttpsにリダイレクトする

1 はじめに1.1 前提条件2 ALBの設定3 Nginxの設定3.1 注意点4 さいごに はじめに httpsに対応済みのWebサイトの場合、httpでアクセスされた時にhttpsでリダイレクトする ...

フォロー

follow us in feedly

AppLink

英語

page_side_300rect

2018年6月
« 5月 7月 »
 12
3456789
10111213141516
17181920212223
24252627282930

アプリ情報

目標を達成したい方を応援する、TODOアプリもリリースしております。 下記のアイコンから無料でダウンロードできます。

Web版MyCoach

私たちはより広い方にコーチングを知ってもらいたいと考えています。 下記のサイトにて、コーチの方々を紹介しておりますので、よろしければご覧ください。