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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

12416閲覧

Rails 中間テーブルを経由してのカラムの値の取得

tsubasa-i

総合スコア21

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1グッド

4クリップ

投稿2016/11/07 08:57

編集2016/11/07 09:29

###前提・実現したいこと
railsでユーザーがツイッターのようにタイムラインに投稿できるものを作っています。さらに、ユーザーがグループを作り、そのグループページでメンバーの投稿を表示したいです。
アソシエーションは以下のように組んでいます。
Groups
has_many :user_groups
has_many :users, through: :user_groups
Users
has_many :reviews
has_many :user_groups
has_many :groups, through: :user_groups
UserGroups
belongs_to :user
belongs_to :group
Reviews(投稿)
belongs_to :user
UsersとGroupsが多対多の関係になっており、中間テーブル(UserGroups)でつないでいます。

ユーザーが所属しているグループ一覧をこのように表示させています。
例)
・太郎グループ
・花子グループ
そしてグループ名をクリックするとグループページに飛ぶようになっています。

UserGroupsテーブルのカラムは
id | user_id | group_id
の3つです。

####ここに質問したいことを詳細に書いてください
@group = Group.find(params[:id]).id
ここでクリックしたグループのidを取得できていると思います。
仮に1とします。
@users = UserGroup.where(group_id: @group)
そしてここでgroup_idカラムにクリックしたグループのid(ここでは1)を持つレコードを取得
@reviews = @users.user_id.reviews
group_idカラムに1をもったすべてのuser_idを取得し、そのuserがもっているreview(投稿)をとる

こういうつもりでコードを書いているのですがうまくいきません。
つたない説明ですが、回答していただけると幸いです。

###発生している問題・エラーメッセージ

undefined method `user_id'というエラーメッセージが出ます。

###該当のソースコード

@group = Group.find(params[:id]).id #クリックしたグループのid取得 @users = UserGroup.where(group_id: @group)#クリックしたグループのidを持つレコードを取得 @reviews = @users.user_id.reviews

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
ruby
rails 4.2.6

s_tatsuki👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1@group = Group.find(params[:id]).id 2# ここでクリックしたグループのidを取得できていると思います。

ええ。たしかにそうなんですが、おかしな事をやっていなければ Group.find(params[:id]).id == params[:id] なのであんまり意味がないですね。

という事で全面的に書き直した方がいいです。

Group#id (params[:id]) から、その Group に所属する User に関連する Review を取得したいのであれば

ruby

1reviews = Group.find(params[:id]).users.map(&:reviews)

です。


undefined method `user_id'というエラーメッセージが出ます。

これは恐らく

ruby

1@reviews = @users.user_id.reviews

の部分で出ているはずです。

この前の行で

ruby

1@users = UserGroup.where(group_id: @group)#クリックしたグループのidを持つレコードを取得

としているので @usersUserGroup::ActiveRecord_Associations_CollectionProxy という配列のようなもののインスタンスです。

そのインスタンスに対して #user_id というインスタンスメソッドを呼ぼうとしているので、そんなメソッドはないよ。という例外が発生しています。


ruby

1<% @reviews.each do |review| %> 2<%= review.title %> 3<%= review.text%> 4<% end %>

viewでこういう使い方をしたいのであればcontroller側では

ruby

1@reviews = Group.find(params[:id]).users.map(&:reviews).flatten

または

ruby

1@reviews = Group.find(params[:id]).users.flat_map(&:reviews)

あたりが例です。

投稿2016/11/07 09:43

編集2016/11/07 22:15
hana-da

総合スコア1728

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

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

tsubasa-i

2016/11/07 13:35 編集

回答ありがとうございます! 回答にある reviews = Group.find(params[:id]).users.map(&:reviews) というように書き直して実行してみたところ undefined local variable or method `reviews'というエラーが出てしまいました。 そこで、@reviewsにビューファイル共にと書き直して実行したところ、今度はreviewsテーブルの中のカラムに対してno method errorが出てしまいます。 なぜでしょうか?
tsubasa-i

2016/11/07 13:40

<% @reviews.each do |review| %> <%= review.title %> <%= review.text%> <% end %> ビューファイルではこのようにeachで投稿の内容をとってきて表示しようとしています。
hana-da

2016/11/07 22:15

どのように使われるのかが質問に書いてなかったので。。。。 次の質問ではそういう事も含めておいてもらえると助かります。
tsubasa-i

2016/11/08 04:28

やりたいことができました! つたない説明でしたが丁寧に解説していただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問