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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

SQL

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

Q&A

解決済

1回答

1057閲覧

Rails ポリモーフィックでの includes検索について

IRIESS

総合スコア45

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

SQL

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

0グッド

0クリップ

投稿2022/04/01 03:41

現在Rails apiを使用してアプリ開発を勉強中です。

N+1問題対策でinludes検索をしたいと考えております。
先ずモデルの定義を提示させてください。

ruby

1class UserNotice < ApplicationRecord 2 belongs_to :user 3 belongs_to :source, polymorphic: true, optional: true 4end 5 6class Agreement < ApplicationRecord 7 belongs_to :user 8 belongs_to :host 9 belongs_to :room 10 has_many :user_notices, as: :source 11end 12 13class Room < ApplicationRecord 14 belongs_to :user 15 belongs_to :host 16 has_many :user_notices, as: :source 17end 18 19 20class Host < ApplicationRecord 21 has_many :agreements 22 has_many :rooms 23end
useruser_noticesagreementsroomshost
ididididid
user_iduser_iduser_id
source(type,id)host_idhost_id
room_id

参考にさせていただいたサイト
https://himakan.net/program/ror/polymorphic_includes
の通りに

ruby

1# user_notices_controller.rb 2class UserNotice < ApplicationRecord 3 belongs_to :source, polymorphic: true, optional: true 4 belongs_to :user 5 6 belongs_to :agreement, ->{ joins(:user_notices).where(user_notices: {id: UserNotice.where(source_type: 'Agreement')})}, foreign_key: :source_id

ruby

1def index 2 notice = UserNotice.where(user: current_api_user).includes(agreement: :host) 3 render json: notice , status: :ok 4end

としました。
期待通りに、user_noetice.agreement.hostが取得オブジェクトが返ってくると思っていたのですが、

# エラー ActiveRecord::ConfigurationError in Api::UserNoticesController#index Can't join 'Agreement' to association named 'user_notices'; perhaps you misspelled it?

上記エラーが出現しました。
他のサイトを探しても解決できませんでした。設定に不備がありますでしょうか?
追記したほうが良い情報がありましたらすぐに追記します。
先輩エンジニアの皆様よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

自己解決

notice = UserNotice.where(user: current_api_user).includes(Source: :host)
とすることにしました

投稿2022/04/01 06:56

IRIESS

総合スコア45

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問