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

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

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

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2052閲覧

他モデル(UserとShop)同士でのフォロー機能実装に必要なカラムは?

s.k

総合スコア423

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2016/10/19 03:09

編集2016/10/19 03:59

###前提・実現したいこと
他モデル同士のフォロー機能を実装したいです。
具体的なモデルは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へ

といった具合にです。

恐縮ですが、、、
今、こうして書いていてもしかしたらできるのかも。。。
という考えも出てきました。

聞きたいことまとめます。

①他モデル間のフォロー機能を実装する場合、カラム名のidはクラス名_idにしても実装できるか。
②①ができなければ、ほかにどんな方法があるのか。

おそらく、私が今投げた疑問は
関連づけの根本的な理解が足りないことによって起こっています。

お手数ですが、
ご助力お願いします!!!!

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

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

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

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

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

guest

回答1

0

ベストアンサー

「ユーザーがユーザーをフォローする」場合、どちら向きでも何も変わらないですが、「ユーザーが店をフォローする」のと「店がユーザーをフォローする」のは明らかに別な機能です

ということで、「店→ユーザーのフォロー」と「ユーザー→店のフォロー」で別々に中間テーブルを用意して、それぞれにuser_idshop_idを持たせる、という形が適切ではないかと思います。

他モデル間のフォロー機能を実装する場合、カラム名のidはクラス名_idにしても実装できるか。

むしろ、モデル名_idのやり方が本来のRails wayです。

投稿2016/10/19 04:09

maisumakun

総合スコア145121

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

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

s.k

2016/10/19 04:10

そうだったんですね。。。 さっそく作ります! ありがとございます(#^^#)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問