まずRubyリファレンスに載っていたmapメソッドの説明が以下です。
mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。
###現状
teratail風のポートフォリオを作成中。
その中で、ユーザの詳細画面にて自分が回答した質問を表示させる要件がある。
そして今回私が質問したいmapメソッドの挙動として私が実装しているmapメソッドが以下です。(後にもう一度登場させますのでここはチラ見で構いません)
#自分が回答した質問を表示する = "AnsweredQuestions:#{@user.answers.map(&:question).count}"
#以下、モデルのアソシエーション等の説明
usercontroller
1 2def show 3 #ユーザに紐づく質問と回答を取得 4 @user = User.includes(:questions, :answers).find(params[:id]) 5 end 6
####以下モデル
user
1 2 has_many :questions 3 has_many :answers 4
answer
1 2belongs_to :question 3
question
1 2has_many :answers, dependent: :destroy 3belongs_to :user 4
user_controllerのshowアクションにて紐づく質問、回答を引っ張ってきています。
modelとしてはユーザが質問と回答をhas_manyしており、質問が回答をhas_many、回答は質問にbelongs_toする形となっています。
#今回質問したいこと
ユーザのshow.html.slimにて自身が回答した質問を表示する
箇所です。
show(html)
1 2= "AnsweredQuestions:#{@user.answers.map(&:question).count}" 3 4
####聞きたいのはなぜこれで自身が回答した質問が引っ張ってこれるのか
です。
mapメソッドの意味を再掲すると
mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。
です。
当初私は以下のように実装してNoMethodError
でハマっていました。
= "AnsweredQuestions:#{@user.answers.question.count}"
これでなぜ取得できなくて、mapメソッドを使うと自身が回答した質問
が取得できるのでしょう。。。。また、これの他に実装方法があればご紹介いただけると嬉しいです。
中で何が起こっているかがわからず、他の処理を知れたら幾らかのヒントになるかと思っています。
ご指摘も頂けると大変嬉しいです。よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/20 22:48