質問: ### 前提・実現したいこと テーブル設計とアソシエーションについて相談したいことがあります。 以下の内容でアプリを制作しています。 以下の機能を実装します。 ・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を学び始めて長くなく、なんども調べましたが適当な情報も見つかりません。アドバイスのほどよろしくお願いします。
回答: (3)の応用として、**ポリモーフィック関連**というものがあります(Rails Guide)。`_id`と`_type`の2つの列で、どのテーブルのどれと紐付いているのかを管理します。 ただ、データベース上の外部キーで結べない、という問題がありますので、他の持たせ方も考えられます(参考)。