MrTom_2020
@MrTom_2020 (と む)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

joinsでの取り出し方について

joinsでうまく取り出せません。

環境

ruby 2.5.1
rails 6.0.3.2
devise 4.7.2

アソシエーション

userモデル
  has_many:tags
  has_many:group_users
  has_many:groups,through: :group_users
group_use中間モデル
  belongs_to :group
  belongs_to :user
groupモデル
  has_many:group_tags
  has_many:tags,through: :group_tags
  has_many:group_users
  has_many:users,through: :group_users
group_tag中間モデル
  belongs_to :group
  belongs_to :tag
tagモデル
  has_many:group_tags,dependent: :destroy
  has_many:groups,through: :group_tags
  belongs_to:user

maigationファイル内記述を簡単に説明

user
# おそらく今回の件とは関係がないため割愛します。
group_use
t.references :group, foreign_key: true
t.references :user, foreign_key: true
group
# おそらく今回の件とは関係がないため割愛します。
group_tag
t.references :group, foreign_key: true
t.references :tag, foreign_key: true
tag
t.references :user, foreign_key: true

やりたいこと

tags_controller.rb
  def index
    if user_signed_in?
      @groups=Group.joins(:group_users).where(group_users:{user_id:current_user.id})
      @tags=Tag.joins(group_tags: :group_users).where(group_users:{user_id:current_user.id})
  end

上のrubyコードを御覧ください。まず、
@groupsはcurrent_user.idを利用し、group_usersを介してグループの情報を取得しています。
current_user.id → group_user → group_id → group
ここは成功しました。

次に
@tagsでcurrent_user.idを利用し、group_users、group_tagsを介してタグの情報を取得しようとしました。
current_user.id → group_users → group_id → group_tags → tag_id → tags
これに失敗しました。

current_userが所属するgroupが所有するtagをすべて取得したいと考えておりますがうまくいきません。
N+1問題対策のため、なるべくjoinを使用して解決したいです。

どなたかわかる方がいらっしゃいましたら、ご教授いただけたら幸いです。
誠に申し訳ありませんが、よろしくお願いいたします。

0

2Answer

Comments

  1. @MrTom_2020

    Questioner

    ありがとうございます!やってみます!

tagがgroup_usersを持っていないからですかね?どんなSQLが発行されていますか?

0Like

Comments

  1. @MrTom_2020

    Questioner

    ご質問ありがとうございます。
    うまく行かない下の
    @tags=Tag.joins(group_tags: :group_users).where(group_users:{user_id:current_user.id})

    SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2
    になります。
    わかりそうですか?

Your answer might help someone💌