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

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

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

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

Ruby

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

Q&A

解決済

2回答

446閲覧

Rails 異なるモデルが同じPostを持つ場合のアソシエーションについて

TakashiOda

総合スコア34

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/04/16 07:36

前提・実現したいこと

テーブル設計とアソシエーションについて相談したいことがあります。
以下の内容でアプリを制作しています。

以下の機能を実装します。
・User(消費者)とProducer(生産者)、Restaurant(飲食店)が存在する
・Userだけが持つカラム(SNSのID, 性別, 年代)
・Producer/Restaurantだけが持つカラム(住所, 電話番号)
・3つのモデルはインスタグラムのように同じPostを投稿できる
・Post.allでpost一覧を取得することもある
・User.posts / Shop_user.posts /Restaurant.posts でpostをモデル別に分けて取得することもある

質問です

その場合のアソシエーションが調べても分かりません。
postテーブルには user_id と shop_user_id、Restaurant_id がどれであっても格納できる「post_owner_id」のような共通カラムを作ると、userやshop_userのidが同じだった場合におかしなことになるとは理解しています。

そうなると、以下のアイデアのうちどれが好ましいのでしょうか?
#####(1)・postテーブルに3つのカラム
postテーブルにはuser_id と shop_user_id、restaurant_id のカラムをそれぞれ3つ作る。nilの場合が生まれるのでそれぞれにoptional :trueをつける。

#####(2)3つのモデルに対してそれぞれ別のpostテーブルを作成
userはuser_postsを作成
producerはproducer_postsを作成
RestaurantはRestaurant_postsを作成

#####(3)全てUserに統一しuser_kindカラムでタイプ分け
・User(消費者)とProducer(生産者)、Restaurant(飲食店)はモデルで分けず
userに「user_kind」というカラムを作成し、userだったら0, Producerだったら1などと
登録時に挿入。
人格によってプロフィールが異なるので、
userの場合はhas_oneの関係でuser_profileテーブルをもたせ
Producer/Restaurantには同じくhas_oneの関係でbusiness_profileテーブルをもたせる

#####(4)もしくは・・・?

他にそういう場合の王道設計などはあるのでしょうか?

##私の考え
(1)が一番シンプルな気もしますが自信がありません。

railsを学び始めて長くなく、なんども調べましたが適当な情報も見つかりません。アドバイスのほどよろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

(3)の応用として、ポリモーフィック関連というものがあります(Rails Guide)。_id_typeの2つの列で、どのテーブルのどれと紐付いているのかを管理します。

ただ、データベース上の外部キーで結べない、という問題がありますので、他の持たせ方も考えられます(参考)。

投稿2019/04/16 07:53

maisumakun

総合スコア145121

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

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

TakashiOda

2019/04/16 08:28

maisumakun さん ありがとうございます。「ポリモーフィック関連」は知らなかったので助かります。ただおっしゃる通り、デメリットもあることもおかげさまで理解できました。ポリモーフィック関連を使わずに、参考URLにあるような他の方法で行こうと思います。 ありがとうございました!
guest

0

多対多の時の中間テーブルのように
交差テーブルというものを作ることで解決しました。
参考URL
https://blog.motimotilab.com/?p=207

投稿2019/04/17 02:27

TakashiOda

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問