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


関連記事

laravel logo

Laravelの基礎知識

1 はじめに2 Laravelの概要2.1 学習コストが低い2.2 Symfonyがベース2.3 DIを積極的に活用している3 ディレクトリ構成3.1 app3.2 bootstrap3.3 conf ...

【Ruby Advent Calender 2017】Rubyでスクレイピングをしてみる【11日目】

1 はじめに1.1 概要2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 他のサイトの記事でも試してみ ...

Rust入門してみた その4 モジュール編

1 はじめに2 Rustのモジュール2.1 モジュールツリーの構築2.2 サブモジュール2.3 各モジュールの実装2.4 モジュールのプライバシー3 さいごに4 おすすめ書籍 はじめに これまでの記事 ...

laravel logo

Laravel-debugerbarを使ってみた

1 はじめに2 インストール3 主な項目3.1 Messages3.2 Timeline3.3 Queries3.4 N+1 Queries3.5 Session3.6 Request4 さいごに5 ...

Go言語

Goのfmt.print系関数のまとめ

1 はじめに2 print関数の命名規則3 各print関数の説明3.1 Print(標準出力へ出力)系関数3.2 Sprint(文字列を出力)系関数3.3 Fprint(ファイルへ出力)系関数4 書 ...

フォロー

blog-page_side_responsive

2018年6月
 12
3456789
10111213141516
17181920212223
24252627282930

アプリ情報

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