質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1297閲覧

Ruby on Railsにおいて別名の外部キーを使った1対1のアソシエーションを書きたい

_yassan

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/11/07 04:24

編集2021/11/07 04:28

前提・実現したいこと

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)を実行した際に結合された出身県、現住県データが取得できない。

質問内容

  1. 上記のような別名の外部キーを使った場合のアソシエーションはどのように書くのがよいでしょうか。
  2. また「そもそも今考えているやり方がよくない」、「このやり方の方がいい」などありましたら教えていただけますと幸いです。

(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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決できました。

  • アソシエーションの関係性が逆だった(Memberがbelongs_to, Prefectureは指定不要)
  • class_nameの指定の頭文字が小文字だった(クラス名と一致するよう大文字に修正)

ruby

1class Member < ApplicationRecord 2 belongs_to :home_prefecture, class_name: 'Prefecture' 3 belongs_to :residence_prefecture, class_name: 'Prefecture' 4end

ruby

1class Prefecture < ApplicationRecord 2end

投稿2021/11/07 06:30

_yassan

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問