環境
ruby 2.5.1
rails 6.0.3.2
devise 4.7.2
postgre 12.3
アソシエーション
ruby
1userモデル 2 3 has_many:tags 4 has_many:group_users 5 has_many:groups,through: :group_users
ruby
1group_use中間モデル 2 3 belongs_to :group 4 belongs_to :user
ruby
1groupモデル 2 3 has_many:group_tags 4 has_many:tags,through: :group_tags 5 has_many:group_users 6 has_many:users,through: :group_users
ruby
1group_tag中間モデル 2 3 belongs_to :group 4 belongs_to :tag
ruby
1tagモデル 2 3 has_many:group_tags,dependent: :destroy 4 has_many:groups,through: :group_tags 5 belongs_to:user
maigationファイル内記述を簡単に説明
ruby
1user 2 3 # おそらく今回の件とは関係がないため割愛します。
ruby
1group_use 2 3 t.references :group, foreign_key: true 4 t.references :user, foreign_key: true
ruby
1group 2 3 # おそらく今回の件とは関係がないため割愛します。
ruby
1group_tag 2 3 t.references :group, foreign_key: true 4 t.references :tag, foreign_key: true
ruby
1tag 2 3 t.references :user, foreign_key: true
やりたいこと
SQLを Active Record クエリインターフェイス に変換したい。
ruby
1tags_controller.rb 2 3 def index 4 if user_signed_in? 5 @tags=Tag.joins(:groups).where(user_id:current_user.id).distinct 6 end
上のrubyコードを御覧ください。
ruby
1@tags=Tag.joins(:groups).where(user_id:current_user.id).distinct
上記を使用し、一時はうまく行っていると思っていたのですが、
1つのタグをグループに登録し、ユーザー2人で共有したときに
タグをcreateしたユーザーしか、タグを見ることが出来ませんでした。
次に根本的にSQLでどうやるの??と考えたところ、以下でうまくいきました。
sql
1SELECT distinct "tags" FROM "tags" 2INNER JOIN "group_tags" ON "group_tags"."tag_id" = "tags"."id" 3INNER JOIN "group_users" ON "group_users"."group_id" = "group_tags"."group_id" 4WHERE (group_users.user_id = 2) #2の部分にcurrent_user.idが入ります。 5ORDER BY "id"
そこでこれをrailsにと
ruby
1Tag.joins(:group_tags).joins(:group_users).where(group_users:{user_id:current_user.id})
とか
ruby
1Tag.joins(:group_tags,:group_users).where(group_users:{user_id:current_user.id})
とか
ruby
1Tag.joins(group_tags: :group_users).where(group_users:{user_id:current_user.id})
とか
Railsガイド Active Record クエリインターフェイス
を見ながら色々と試したのですが解決には至りませんでした。OTL
どなたかお詳しい方お教え願えないでしょうか?
よろしくお願いいたしますm(T-T)m
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。