🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

SQL

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

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

3回答

1765閲覧

[Rails]ログインユーザーidを使って、異なるテーブルに存在する値を出力したい[ActiveRecord]

zyno

総合スコア41

Ruby

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

SQL

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

Ruby on Rails

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2019/12/13 15:56

編集2019/12/14 01:55

実現したいこと

Railsのアプリケーション開発をしている者です。ログインしているuserのidを利用して、以下のfriend_infoテーブル内にあるnameのフィールドを一覧出力したいと思っています。

[userテーブル]
id

[friendテーブル]
id
user_id

[friend_infoテーブル]
id
friend_id
name
sex
birthday

※userテーブル→friendテーブル→friend_infoテーブルの順で従属関係は成り立っています。
※userテーブル、friendテーブル、friend_infoテーブルにはあらかじめテストデータが入っています。

やったこと

ruby

1//動く 2 def index 3 friends = Friend.find_by(user_id: current_user.id) 4 @friends = friends.friend_info.all 5 end

上記のコードは動きます。画面上にデータが1件だけ表示されました。しかし今回は、「『user_id=ログインユーザー』に合致するfriend_infoテーブル内にあるnameのフィールドを複数件、画面に一覧出力したい」ので、find_byではなく、where句を使いたいです。

しかし、

ruby

1//動かない 2 def index 3 friends = Friend.where(user_id: current_user.id) 4 @friends = friends.friend_info.all 5 end

これだと、二行目のfriendsがNoMethodErrorになります。しかし、friends変数をコンソールで調べたら、値はしっかり入っていました。

どうして想定どおり動かないのか分からなくなってしまったので、ご教授願いたいと考えています。よろしくお願いいたします。

191214追記

イメージ説明

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

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

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

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

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

guest

回答3

0

ベストアンサー

Ruby

1# controller 2 3def index 4 @friends = Friend.where(user_id: current_user.id) 5end

html

1<% @friends.each do |friend| %> 2 <li> 3 <%= link_to friend.friend_info.name, friends_path %> 4 </li> 5<% end %>

で表示できると思います。

(N+1問題が発生するので Friend.where(user_id: current_user.id).includes(:friend_info) とすると回避もできるかと思います。

FYI: Rails で includes して N+1 問題対策 - Qiita

投稿2019/12/26 03:25

ducci

総合スコア191

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

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

0

@friend_infos = friends.friend_info.all

のように一気に持ってくることはできません。

@friend_infos = [] #空の配列を作る friends.each do |friend| @friend_infos.push(friend.friend_info) #friendひとつずつ,対応するfriend_infoを持ってきて@friend_infosに入れる end

とするとエラーが出ないでしょう。
(eachで回さないスマートな方法もありますが,最初はこちらで理解したほうが良いと思います)

投稿2019/12/22 10:18

k-810

総合スコア192

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

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

0

念の為に「userテーブル→friendテーブル→friend_infoテーブルの順で従属関係は成り立っています。」の定義部分を見ておきたいです。
この回答でうまく行かなかったら、それを見せて下さい。
あと
@friends = friends.friend_info.allで@firiendにはFriendInfoが入ってますが、それは承知ですね?

@friends = FriendInfo.joins(:friend). where(friend: {user_id: current_user.id})

かな

投稿2019/12/13 21:48

winterboum

総合スコア23567

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

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

zyno

2019/12/14 02:21 編集

ごめんなさい、初心者なので定義部分という言葉に対してどういった回答をすれば適切なのかがよくわかっていないです。一応ER図を概要に追記しました。indexとかは追加しておらず、ただidで繋いだだけの内容となっております。 >@friends = friends.friend_info.allで@firiendにはFriendInfoが入ってますが、それは承知ですね? はい。今回はFriendInfoに入っているnameを画面に表示させたいので、最終的に@friendsに入る値はFriendInfo の情報だと考えています。
winterboum

2019/12/14 03:09

回答に書いておいた式は試していただけましたか? 定義部分というのは、関連の定義という意味で言いました belongs_to とか has_* とか言うところです
zyno

2019/12/14 03:17

試した結果、ビューの部分でInvalidStatementエラーになりました。 エラー内容 >Mysql2::Error: Unknown column 'friend.user_id' in 'where clause': SELECT `friend_infos`.* FROM `friend_infos` INNER JOIN `friends` ON `friends`.`id` = `friend_infos`.`friend_id` WHERE `friend`.`user_id` = 1 → <% @friends.each do |friend| %> <li> <%= link_to friend.name, friends_path %> </li> <% end %>
zyno

2019/12/14 03:19

friendの定義部分は belongs_to :user has_many :friend_infos, dependent: :destroy validates :user_id, presence: true friend_infoの定義部分は belongs_to :friend です!
winterboum

2019/12/26 00:09

定義書かれているのを見落としてました。 もう解決できた? なら読み飛ばしてください。 friend.user_id がないというエラーになってます friends.user_id でなければならないのに。 賢い書き方でなくちょっと無骨ですが @friends = FriendInfo.joins(:friend). where("friends.user_id = ?",current_user.id ) で試してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問