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

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

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

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

Ruby

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

Q&A

解決済

1回答

1781閲覧

railsでのインスタンス変数でのパラメータ指定方法

sanezane

総合スコア91

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/08/17 14:46

編集2019/08/18 01:45

#前提
####teratail風のポートフォリオを作成中。

#やりたいこと
###自分が回答した質問を表示したい。(以下、teratailのイメージ)
イメージ説明

#自分の投稿した質問については取得・表示できている(以下キャプチャ)
イメージ説明

#前提(テーブル設計)
usersテーブルとquestionsテーブル、answersテーブルを使用。questionsテーブルにはuser_idが、answersテーブルにはquestion_id,user_idを持っています。

create_table "answers", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.bigint "question_id" t.string "name" t.text "content" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "user_id", null: false t.string "author" t.index ["question_id"], name: "index_answers_on_question_id" t.index ["user_id"], name: "index_answers_on_user_id" end create_table "questions", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" t.string "title" t.text "content" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "user_id", null: false t.string "author", null: false t.index ["user_id"], name: "index_questions_on_user_id" end create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "name" t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "password_digest" t.boolean "admin", default: false, null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.string "provider" t.string "uid" t.string "nickname" t.string "image" t.string "token" t.string "secret" t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end

#実装とエラー画面
Userコントローラのshowアクションで表示させます。

UserController

1 2def show 3 @user = User.find(params[:id]) 4 @questions = @user.questions.where(user_id: @user.id) 5 @answers = Answer.where(user_id: @user.id) 6 #以下で、回答(answers)した質問(questions)を取得しようとしている 7 @answered_questions = @questions.where(id: @answers.question_id) 8 @followings = @user.followings.page(params[:page]) 9 @followers = @user.followers.page(params[:page]) 10 end 11

イメージ説明

@answered_questions = ...にてanswersテーブルのquestion_idをパラメータに質問(questions)を取得したいのですが、エラーになってしまいます。

###@answersの中身
debug画面(赤枠)です。
####@answersを取得した画面
イメージ説明
####@answers.question_idを取得しようとした画面
イメージ説明

やはりquestion_idが取得できないでいます。

■2019/08/19追記
question_idsとした時のエラー画面
イメージ説明

ご指摘をよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@answersはAnswer.where(...) で抽出しているので、ActiveRecord_Relation (複数レコード) になりますね。
この場合は、対応するquestion_idも複数になるので、@answers.question_id ではなくて、@answers.question_idsではどうでしょう。

修正&追記

Relationでもう少しうまいやり方があるかなと思いますが思い出せずすみません。

SELECT question_id FROM Answers WHERE ... の結果であれば、@answers.pluck(:question_id) で、[1, 2] みたいな配列で取得できます。
consoleかブレークポイントで @answers.pluck(:question_id) の結果を確認してみてくださいね。

投稿2019/08/17 16:19

編集2019/08/18 04:08
suama

総合スコア1997

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

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

sanezane

2019/08/18 01:47

ご回答ありがとうございます。 ご指摘の通り修正してみたところ事象は変わらずでした。 検索元の@questionsとパラメータの型なんかを意識する必要があるのでしょうか。。。その辺りを調査中です。。
sanezane

2019/08/18 01:48

ちなみにuserモデルに`has_many :questions`と`has_many :answers`は付与してあります。
sanezane

2019/08/18 06:52

ありがとうございます!ご指摘を参考に `@question_ids = @answers.pluck(:question_id) @answered_questions = Question.where(id: @question_ids)`として回答した質問を取得することが出来ました。 また、別の方法もあるようで... 回答を取得する`@answers = Answer.where(user_id: @user.id)`の箇所を `@answers = Answer.includes(:question).where(user: @user)` として view側で`@answers.map(&:question)`とすることでも回答した質問が取得できるようでした!!
suama

2019/08/19 01:28

良かったです、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問