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

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

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

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

Q&A

解決済

1回答

2373閲覧

Rails 関連テーブルのカラムの中身を取得したい

ruby_0ct

総合スコア57

Ruby on Rails

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

0グッド

0クリップ

投稿2018/03/26 15:38

編集2018/03/26 16:13

has_manyで3つのテーブルを関連させ、includesしてviewで展開したいのですが、関連先のテーブルのカラム名を指定しても、undefined method 'カラム名' for #<Good::ActiveRecord_Associations_CollectionProxy:0x007fc84d57bcb0>とエラーになってしまいます。

userテーブルブログ記事のテーブルとその記事にいいねしたユーザーを記録するテーブルの3つのテーブルがあります。

トップページにアクセスした時に記事一覧とそのブログをいいねした最新のユーザー名を1人を表示させたいです。

テーブルの関係は、
user 1対多 blogs 1対多 goods
と3つのテーブルが関連しています。_userとgoodsの直接的な関係はありません。

モデル

blog.rb

class Blog < ApplicationRecord belongs_to :user, optional: true has_many :goods validates_associated :good accepts_nested_attributes_for :goods end

good.rb

class Good < ApplicationRecord belongs_to :blog accepts_nested_attributes_for :blog, allow_destroy: true belongs_to :user end

user.rb

class Good < ApplicationRecord has_many :blogs has_many :goods, through: :blogs end

コントローラ

def index @blogs = Blog.includes([:user, :goods]).order(created_at: :desc) end

view

<% @blogs.each do |blog| %> <p><%= blog.title %></p> <p><%= blog.goods.user_name %></p> <% end %>

viewのuser_name部分で以下のエラーになります。

NoMethodError undefined method `user_name' for #<Good::ActiveRecord_Associations_CollectionProxy:0x007fc84d57bcb0>

ただ、不思議なことにblog.goodsまでをinspectメソッドでデバッグしてみると、正常にgoodテーブルの中身が取得されるのです。
しかし、カラムを指定しようとblog.goods.user_nameとすると、メソッドエラーとなるのが不思議でなりません。

設定が間違っているのでしょうか?教えていただければ助かります。

テーブルの状況は以下の通りです。
ブログを始めた記事のいいねが1件と最近こんなことあったという記事のいいねが2件の場合。
blogs(ブログ記事テーブル)

idtitle
1ブログ始めました
2最近こんなことがありました

goods(いいねテーブル)

iduser_nameblog_id
1yamada1
2yamada2
3tanaka2

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

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

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

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

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

guest

回答1

0

自己解決

エラー文のActiveRecord_Associations_CollectionProxyがポイントでした。
https://teratail.com/questions/10221
こちらを参照したところ、eachの中にeachを回す必要がありました。

投稿2018/03/26 17:33

ruby_0ct

総合スコア57

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問