質問編集履歴

1 エラー文を修正

ruby_0ct

ruby_0ct score 53

2018/03/27 01:13  投稿

Rails 関連テーブルのカラムの中身を取得したい
has_manyで3つのテーブルを関連させ、includesしてviewで展開したいのですが、関連先のテーブルのカラム名を指定しても、```undefined method```とエラーになってしまいます。
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'
undefined method `user_name' for #<Good::ActiveRecord_Associations_CollectionProxy:0x007fc84d57bcb0>
```
ただ、不思議なことに```blog.goods```までを```inspectメソッド```でデバッグしてみると、正常にgoodテーブルの中身が取得されるのです。
しかし、カラムを指定しようと```blog.goods.user_name```とすると、メソッドエラーとなるのが不思議でなりません。
設定が間違っているのでしょうか?教えていただければ助かります。
テーブルの状況は以下の通りです。
ブログを始めた記事のいいねが1件と最近こんなことあったという記事のいいねが2件の場合。
blogs(ブログ記事テーブル)
|id|title|
|:--|:--:|
|1|ブログ始めました|
|2|最近こんなことがありました|
goods(いいねテーブル)
|id|user_name|blog_id|
|:--|:--:|:--:|
|1|yamada|1|
|2|yamada|2|
|3|tanaka|2|
  • Ruby on Rails

    17043 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る