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

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

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

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

2551閲覧

SQLを Active Record クエリインターフェイス に変換したい。

tomtomtomtom

総合スコア563

Ruby on Rails 6

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/08/08 16:37

編集2020/08/08 21:28

環境

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

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

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

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

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

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

guest

回答1

0

自己解決

ruby

1Tag.joins(groups: :group_users).where(group_users:{user_id:current_user.id}).distinct.order(:id)

これでなんとか行けたと思います。
以下は参考まで

sql

1SELECT DISTINCT "tags".* FROM "tags" 2INNER JOIN "group_tags" ON "group_tags"."tag_id" = "tags"."id" 3INNER JOIN "groups" ON "groups"."id" = "group_tags"."group_id" 4INNER JOIN "group_users" ON "group_users"."group_id" = "groups"."id" 5WHERE "group_users"."user_id" = 2 #2はcurrent_user.id 6

投稿2020/08/09 05:51

tomtomtomtom

総合スコア563

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問