- Roomテーブル
ID | name |
---|---|
1 | room1 |
- Userテーブル
ID | room_id | name |
---|---|---|
1 | 1 | ユーザ1 |
2 | 1 | ユーザ2 |
- Postテーブル
ID | room_id | user_id | name |
---|---|---|---|
1 | 1 | 1 | post1 |
2 | 1 | 2 | post2 |
- Commentテーブル
ID | room_id | user_id | post_id | message |
---|---|---|---|---|
1 | 1 | 1 | 1 | comment1 |
2 | 1 | 1 | 1 | comment2 |
3 | 1 | 2 | 2 | comment3 |
- Assetテーブル
ID | room_id | user_id | post_id | comment_id | asset_type | file_path |
---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | null | image | XXX/YYY |
2 | 1 | 2 | null | null | image | XXX/YYY |
3 | 1 | 1 | 1 | 2 | image | XXX/YYY |
4 | 1 | 2 | 2 | 3 | image | XXX/YYY |
5 | 1 | 2 | 2 | 3 | movie | XXX/YYY |
class Room < ApplicationRecord has_many :users end class User < ApplicationRecord belongs_to :room has_many :posts has_many :images, -> { where(asset_type: "image") }, class_name: "Asset" has_many :movies, -> { where(asset_type: "movie") }, class_name: "Asset" end class Post < ApplicationRecord belongs_to :user has_many :comments has_many :images, -> { where(asset_type: "image") }, class_name: "Asset" has_many :movies, -> { where(asset_type: "movie") }, class_name: "Asset" end class Comment < ApplicationRecord belongs_to :post has_many :images, -> { where(asset_type: "image") }, class_name: "Asset" has_many :movies, -> { where(asset_type: "movie") }, class_name: "Asset" end class Asset < ApplicationRecord enum asset_type: { image: "image", movie: "movie" } end
上記のような関連付けを持ったRailsアプリケーションを作成しております。
日本語で簡単に書くと以下のようになります。
- Roomは複数のUserをもつ
- Userは複数のPost、及び複数のimageとmovieをもつ
- Postは複数のComment、及び複数のimageとmovieをもつ
- Commentは複数のimageとmovieをもつ
- Asset(imageとmovieの実体)はUserとPostとCommentに紐づく
各モデルには外部キーとして所属するモデルのIDを持っているとさせてください。
例:Userモデルにはroom_idがあり、Assetモデルにはuser_idとpost_idとcomment_idがある・・という状況
ここで質問の本題となるのですが、
あるRoomに紐づく上記全ての情報をなるべく少ないSQLの発行回数となるようincludesを用いて所得する
にはどのように書けば良いのでしょうか。
なんとなく以下のような実装になるのかなと考えているのですが、、これでは足りていない認識です。
room_id = 1 # 一例 Room.find_by(id: room_id).users.includes(posts: {comments: [:movies, :images]})
追記:
includesで、と書いてしまいましたが、
上記内容(少ないSQLで関連テーブルの情報を合わせて取得する)が達成できれば
どんな方法でも構いません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/22 13:13
2020/10/22 13:16
2020/10/22 13:49
2020/10/22 21:15
2020/10/23 08:21 編集