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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

801閲覧

中間テーブルの配列の値の取り出し方がわからないです。。

manami0419

総合スコア10

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/09/30 03:42

編集2020/10/01 05:00

前提・実現したいこと

現在合コンマッチングアプリを作成中で、その中のマッチング機能を実装したいのですがうまく動きません。
マッチング機能というのは、いわゆる相互フォローです。
例えば自分が投稿した合コン情報に対して、お気に入りをしたユーザーがいるとします。
そのユーザーの投稿に対して、自分がお気に入りをすると相互フォローになるという仕組みです。
Twitterで例えると、他人のツイートをファボして、その他人が自分のツイートにファボすると、相互フォローになる、というような仕組みです。
ちなみにこのアプリでは、1ユーザー1投稿しかできません。

発生している問題・エラーメッセージ

NoMethodError in FavoritesController#index undefined method `user_id' for #<UserInfo::ActiveRecord_Associations_CollectionProxy:0x00007ffceffef418> Extracted source (around line #7): @favorite_users = current_user.user_info.favorite_users #ユーザーを取ってる binding.pry #7 @matcing = @favorite_user_infos.user_id & @favorite_users.ids ←ここでエラーになります end

該当のソースコード

ruby

1class FavoritesController < ApplicationController 2 def index 3 @users = User.all 4 @favorite_user_infos = current_user.favorite_user_infos #情報を取ってる 5 @favorite_users = current_user.user_info.favorite_users #ユーザーを取ってる 6 binding.pry 7 @matcing = @favorite_user_infos.user_id & @favorite_users.ids 8 9 10 end

これはユーザー(user)と投稿(user_info)の中間テーブルのコントローラーです。
@favorite_user_infosは、current_userがお気に入りした投稿を表しています。
@favorite_usersは、current_userの投稿をお気に入りしたユーザーを表しています。
@matchingで、「@favorite_user_infosのuser_id」と「@favorite_users.ids」の
重複した値を取り出しています。
しかし、「@favorite_user_infosのuser_id」の.user_idがメソッドとして使えません。
上記のエラーがこれに当たります。

試したこと

binding.pryでインスタンス変数に情報が入っているかどうかを調べました。

・@favorite_user_infos.user_idに関して
@favorite_user_infosだけだと、このように自分がお気に入りした投稿の情報が格納されています。
[<UserInfo id: 5, text: "マミコです", people_num_id: 3, area_id: 5, user_id: 5, created_at: "2020-09-26 05:01:29", updated_at: "2020-09-26 05:01:29">...]
この中のuser_idを取得したくて、.user_idを付けましたがエラーになります。
しかし、.idsを付けると投稿のidは取得できます。。

・@favorite_users.idsに関して
@favorite_usersはこのように自分のことをお気に入りしたユーザーの情報を取得できています。
[<User id: 14, nickname: "愛莉", gender: "女", email: "bb@bb.bb"...>...]
.idsを付けると、ユーザーのidが取得できるのでこちらは問題ありません。

.user_idが使えないということは、アソシエーションがうまくできていないということなのでしょうか?
それとも中間テーブル特有の値の取り出し方があるのでしょうか?
調べてもわからなかったので、今回質問させていただきました( ; ; )

補足情報(FW/ツールのバージョンなど)

モデルの情報です。アソシエーションはできていると思うのですが、念のためご確認いただけると幸いです( ; ; )
↓投稿(user_info)のモデルです。

ruby

1class UserInfo < ApplicationRecord 2 belongs_to :user 3 has_one_attached :image 4 5 belongs_to :user 6 has_many :favorites 7 has_many :favorite_users, through: :favorites, source: :user 8 . 9 . 10 .

↓ユーザー(user)のモデルです。

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 has_one :user_info 8 has_many :favorites 9 has_many :favorite_user_infos, through: :favorites, source: :user_info 10 . 11 . 12 .

↓お気に入り(favorite)のモデルです。userとuser_infoの中間テーブルになります。

ruby

1class Favorite < ApplicationRecord 2 belongs_to :user 3 belongs_to :user_info 4end

これができれば、完成に大きく近づくことができます。
お答えいただければ嬉しいです!
よろしくお願いいたします^_^

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

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

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

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

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

guest

回答1

0

自己解決

favoriteコントローラーのindexのbinding.pry以下を、下記に書き換えることで相互フォローのユーザーが表示されました!

ruby

1x = current_user.favorite_user_infos.pluck(:user_id) 2y = current_user.user_info.favorite_users.ids 3z = x & y 4@match = User.where(id: z)

xは、「自分がお気に入りした情報のuser_id」を、配列で取得しています。
yは、「自分の情報をお気に入りしたユーザーのid」を配列で取得しています。
zは、上で取り出したx,yの配列で共通した値だけを取り出しています。
@matchは、Userテーブルから、idがz(相互フォロー状態のUserのid)のユーザーのレコードを取り出しています。

後はビューで、

<% @match.each do |match| %> <p><%= match.nickname %></p> <% end %>

と書いてあげれば、相互フォロー状態になっているユーザーの名前が表示されます!

この問題を考えていただいた方、ありがとうございました!
自分で解くことができたので、とても嬉しいです( ´ ▽ ` )

もし同じようなことをされている方で、この説明を読んでわからないことがありましたら、遠慮なくコメントしてください!

投稿2020/10/01 07:29

manami0419

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問