前提・実現したいこと
現在合コンマッチングアプリを作成中で、その中のマッチング機能を実装したいのですがうまく動きません。
マッチング機能というのは、いわゆる相互フォローです。
例えば自分が投稿した合コン情報に対して、お気に入りをしたユーザーがいるとします。
そのユーザーの投稿に対して、自分がお気に入りをすると相互フォローになるという仕組みです。
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
これができれば、完成に大きく近づくことができます。
お答えいただければ嬉しいです!
よろしくお願いいたします^_^
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。