前提・実現したいこと
Ruby on RailsのAPIモードでチームメンバーのプロフィールを管理するようなシステムを作っています。
その中でメンバー情報のオブジェクトに出身県と現住県の情報を持たせたいと考えています。
関連するテーブル情報は下記です。(質問に関連する箇所だけ抜粋)
members(メンバー情報)
id
first_name
home_prefecture_id
residence_prefecture_id
prefectures(47都道府県の定数情報)
id
name
メンバー情報と都道府県情報の関係はhome_prefecture_idとresidence_prefecture_idでそれぞれ1対1です。
返したいJSONデータ
(ひとまずirbでMember.find(1)
で取れるようにしたい)
json
1{ 2 id: 1, 3 firstName: '太郎', 4 home_prefecture: { id: 1, name: '北海道' }, 5 residence_prefecture: { id: 27, name: '大阪府' } 6}
やりたいことをSQLで表現すると下記のような感じです。
sql
1SELECT m.id, m.first_name AS "名前", hp.name AS "出身県", rp.name AS "現住県" FROM members AS m 2INNER JOIN prefectures AS hp ON m.home_prefecture_id = hp.id 3INNER JOIN prefectures AS rp ON m.residence_prefecture_id = rp.id;
発生している問題・エラーメッセージ
- irbで
Member.find(1)
を実行した際に結合された出身県、現住県データが取得できない。
質問内容
- 上記のような別名の外部キーを使った場合のアソシエーションはどのように書くのがよいでしょうか。
- また「そもそも今考えているやり方がよくない」、「このやり方の方がいい」などありましたら教えていただけますと幸いです。
(Railsやデータベース設計について理解が不十分であるため)
該当のソースコード
ruby
1class Member < ApplicationRecord 2end
ruby
1class Prefecture < ApplicationRecord 2end
試したこと
下記を試してみましたが結合されたデータは取れないようでした。
ruby
1class Member < ApplicationRecord 2 has_one :home_prefecture, class_name: 'prefecture', foreign_key: 'home_prefecture_id', primary_key: 'id' 3 has_one :residence_prefecture, class_name: 'prefecture', foreign_key: 'residence_prefecture_id', primary_key: 'id' 4end
ruby
1class Prefecture < ApplicationRecord 2 belongs_to :member, foreign_key: 'home_prefecture_id' 3 belongs_to :member, foreign_key: 'residence_prefecture_id' 4end
参考にしたドキュメント
https://railsdoc.com/association
※現状ではmigrationファイルで外部キー制約はつけていません。
補足情報(FW/ツールのバージョンなど)
- ruby 3.0.2
- rails 6.0.3
- psql (PostgreSQL) 14.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。