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

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

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

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

Q&A

解決済

1回答

317閲覧

【Rails】アソシエーション(フォローとフォロワーを1つのモデルで)

ta539tg70

総合スコア20

Ruby on Rails 5

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

0グッド

0クリップ

投稿2018/11/27 02:46

練習がてらRailsでTwitterもどきを作っています。
UsersテーブルとFollowsテーブルの2つのテーブルがあり、カラム構成はそれぞれ下記の通りです。

Usersテーブル
id, user_name, email, password

Followsテーブル
id, following_user_id, followed_user_id

Viewで、自分がフォローしているユーザーと、自分をフォローしているユーザー(フォロワー)のuser_nameの一覧をそれぞれ表示したいのですが、どうしたらいいでしょうか。

現状のコードです↓

user.rb

has_many :follows, dependent: :destroy

follow.rb

belongs_to :user, foreign_key: 'followed_user_id'

follows_controller.rb

def index @followings = Follow.all.where(following_user_id: current_user.id) @followers = Follow.all.where(followed_user_id: current_user.id) end

index.html.erb

<h2>Followings</h2> <% @followings.each do |following| %> <p><%= following.user.user_name %></p> <% end %> <h2>Followers</h2> <% @followers.each do |follower| %> <p><%= follower.user.user_name %></p> <% end %>

これだと自分がフォローしているユーザーのuser_nameはきちんと取得できるのですが、フォロワーのuser_nameが取得できずに困っています。
follow.rbforeign_keyfollowing_user_idにすればフォロワーのuser_nameを取得できますが、そうすると今度はフォローしているユーザーの方が取得できなくなってしまいます。ひとつのモデルでこの2つが両方動くようにするにはどのように記述したら良いのでしょうか?(foreign_keyを2つ持たせるなんてできないし...。)どなたかご教示いただけますと幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

別名の関連を作りましょう

ruby

1class Follow 2 belongs_to :user, foreign_key: :followed_user_id 3 belongs_to :follower, foreign_key: :following_user_id, class_name: 'User' 4end

html

1<% @followers.each do |follower| %> 2 <p><%= follower.follower.user_name %></p> 3<% end %>

ただ、 follower.follower となってしまうので @followers は別名にしたほうが良いかも

その発展系

上記で動いて把握できたら以下に続けても良いと思います

  1. has_many 側も繋がりが2つあるので定義したほうが良いでしょう
  2. その2つは明確な名前にすると定義が直感的になるのでおすすめです
  3. has_many through を使えば 中間のFollow テーブルを意識せずに使えます

ruby

1class Follow 2 belongs_to :followed_user, foreign_key: :followed_user_id, class_name: 'User' 3 belongs_to :follower, foreign_key: :following_user_id, class_name: 'User' 4end 5 6class User 7 has_many :active_follows, class_name: "Follow", 8 foreign_key: :follower_id, 9 dependent: :destroy 10 has_many :passive_follows, class_name: "Follow", 11 foreign_key: :followed_id, 12 dependent: :destroy 13 14 # 自分がフォローしている(active_follows)フォローされたユーザー(followed_user) 15 has_many :following_users, through: :active_follows, source: :followed_user 16 17 # 自分がフォローされた(passive_follows)フォローしたユーザー(follower) 18 has_many :followers, through: :passive_follows, source: :follower 19end 20 21class FollowsController 22 def index 23 @following_users = current_user.following_users 24 @followers = current_user.followers 25 end 26end

投稿2018/11/27 03:51

編集2018/11/27 03:52
Ighrs

総合スコア656

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

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

ta539tg70

2018/11/27 06:13

すすすすごい、とても詳細に、ご丁寧に、ありがとうございます!!!ひとまずは発展前の状態で動くことが確認できました。発展系も試してみます!取り急ぎお礼まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問