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| |