前提・実現したいこと
Railsでアンケート機能を実装中です。
モデルが3つ存在し、コントローラーにおいて、親テーブルに対してぶら下がっている子テーブルに関連する孫テーブルのレコード数を出力したいのですが、書き方が分かりません。
アドバイスを頂けますと幸いです。
よろしくお願いいたします。
テーブル
親:Questionnaireテーブル
id | text |
---|---|
1 | 朝ごはんは何派? |
子:Choiceテーブル
id | choice | questionnaire_id |
---|---|---|
1 | パン | 1 |
2 | 和食 | 1 |
3 | グラノーラ | 1 |
孫:Answerテーブル
id | user_id | choice_id | questionnaire_id |
---|---|---|---|
1 | 2 | 3 | 1 |
2 | 3 | 1 | 1 |
3 | 4 | 1 | 1 |
4 | 5 | 2 | 1 |
5 | 6 | 3 | 1 |
6 | 7 | 1 | 1 |
7 | 8 | 1 | 1 |
コントローラ
下記のコードで、questionnaireテーブル
を起点に、answerテーブル
までをchoiceテーブル
経由で取得することはできています。
このままだとanswerテーブル
の中身が取得されるだけなので、choiceテーブル
に紐づくanswer
のレコード数を取得できるようにしたいです。
Ruby
1# questionnaires_controller.rb 2 3 def index 4 @questionnaires = Questionnaire.all.includes(:user) 5 6 render json: @questionnaires.to_json(include: {choices: {include: :answers}}) 7 end
補足情報(FW/ツールのバージョンなど)
Ruby 2.7.2
Rails 6.0.3.4
追記 新たな質問
下記のように、to_json
ではmethods
オプションが使えることが分かりました。
参考
例
Ruby
1# メソッドの結果をカラムのようにして出力する 2# オプションの methods を使います。たとえば Book に要約を出力するインスタンスメソッド summary が定義されている場合は下記のようにします。 3Book.first.to_json(methods: [:summary])
こちらを参考に、下記のようにインスタンスメソッド(countメソッド
)を定義しました。
# questionnaire.rb class Questionnaire < ApplicationRecord has_many :choices has_many :answers def count Answer.group(:choice_id).count end end
しかし、このインスタンスメソッドを下記のto_json
にどのようにして組み込むのかが分かりません。
render json: @questionnaires.to_json(include: {choices: {include: :answers}})
試しにこのようにしてみても、下記のようなエラーがでてしまいます。
Ruby
1# 試し 2render json: @questionnaires.to_json(include: [choices: {include: {methods: :count}}])
Ruby
1# エラー 2undefined method `serializable_hash' for :count:Symbol
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/21 00:16
2021/02/21 03:34