質問: ### 前提・実現したいこと 他モデル同士のフォロー機能を実装したいです。 具体的なモデルはUserとShopです。 ### 発生している問題・エラーメッセージ 問題は中間テーブルのカラム名をいかようにすればわからない点です。 通常(ネット上で落ちている記事で)は、同一モデル(User)間の実装を想定しています。 ですので、テーブル名をRelationshipとすると、カラムにfollower_idとfollowed_idを置きます。そして、modelでは、followerやfollowedクラスをrailsが認識できないので、class_name:"User"をbelongs_to:に添えて、明示します。 しかし、他モデル間での場合、明示するclassは2つありますので上記手法をとれません。 (class_name:"User", class_name:"Shop"の並列はできません。。。よね?) そこで、「カラム名をuser_idとshop_idにすればclassを明示する必要なくね?」と思いました。 しかし、ここでもまた壁にぶち当たる気がします。(正確には頭の中のイメージで。) 例えば、Associationshipという中間テーブルがあったとします。 内在するカラムは、user_idとshop_idです。 フォロー機能の場合、user_idにはshopをフォローするuserのidとフォローされるuserのidを格納しなければなりません。この構造は成り立ちますか? 私はこの手法は成り立たないと考えてしまいました。 理由は、idの用途が違うからです。 用途とは、仕訳です。 単一モデル間のフォロー機能の場合は機能別で仕訳されますが、 他モデル間の場合はクラス名で仕訳されます。 例えば、 通常の単一モデル間のidの行先は フォローする場合→follower_idへ フォローされる場合→followed_idへ という構造になるが、 他モデル間のidの行先は Userがフォローする、される場合→user_idへ Shopがフォローする、される場合→shop_idへ といった具合にです。 恐縮ですが、、、 今、こうして書いていてもしかしたらできるのかも。。。 という考えも出てきました。 聞きたいことまとめます。 1他モデル間のフォロー機能を実装する場合、カラム名のidはクラス名_idにしても実装できるか。 21ができなければ、ほかにどんな方法があるのか。 おそらく、私が今投げた疑問は 関連づけの根本的な理解が足りないことによって起こっています。 お手数ですが、 ご助力お願いします!!!!
回答: 「ユーザーがユーザーをフォローする」場合、どちら向きでも何も変わらないですが、「ユーザーが店をフォローする」のと「店がユーザーをフォローする」のは明らかに**別な機能です**。 ということで、「店→ユーザーのフォロー」と「ユーザー→店のフォロー」で別々に中間テーブルを用意して、それぞれに`user_id`と`shop_id`を持たせる、という形が適切ではないかと思います。 > > 他モデル間のフォロー機能を実装する場合、カラム名のidはクラス名_idにしても実装できるか。 > > > むしろ、`モデル名_id`のやり方が**本来のRails way**です。