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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1473閲覧

投稿数をユーザーの一覧ページに表示させたい。

kokemaru2427

総合スコア8

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/02/24 06:42

編集2021/02/24 08:15

前提・実現したいこと

プログラミングスクールに通うプログラミング初心者です。
現在、ruby on rails でイベント投稿アプリを開発しています。
このアプリは、ユーザーがイベントを開催したいと考えた際に、イベント投稿を行い参加したい人を集うことができます。
そして、その投稿を見た他のユーザーはその投稿に対して、エントリーすることで参加したいという意思表明ができるようなアプリを作っています。

今回解決したいことは、ユーザーの一覧画面(users/index.html.erb)にそのユーザーが投稿している投稿の数を表示させたいということです。現在の自分の実装では、なぜかイベント投稿数ではなく、そのユーザーがエントリーしている投稿の数が表示されてしまいます。

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

<%= user.events.count %>としても なぜかイベント投稿数ではなく、そのユーザーがエントリーしている投稿の数が表示されてしまう。

eventsテーブル(イベント投稿情報を管理)
usersテーブル
entriesテーブル(エントリー情報を管理)

コード情報

(routes.rb)

Rails.application.routes.draw do devise_for :users root to: 'home#top' resources :users resources :events do resources :comments, only: :create resources :entries, only: [:index, :new, :create] end end

(users_controller.rb)

#省略 def index @users = User.all end #省略

(users/index.html.erb)

<% @users.each do |user| %> <p>投稿数:<%= user.events.count %></p> <% end %>

(entry.rb)モデル

class Entry < ApplicationRecord belongs_to :user belongs_to :event end

(event.rb)

class Event < ApplicationRecord #省略 belongs_to :user has_many :comments has_many :entries #省略 end

(user.rb)

class User < ApplicationRecord #省略 has_many :events, dependent: :destroy has_many :comments, dependent: :destroy has_many :entries, dependent: :destroy has_many :events, through: :entries #前に追加 end

試したこと

user.rbに
has_many :events, through: :entriesを追加しなかった場合は
ビューで<p>投稿数:<%= user.events.count %></p>と記述することでそのユーザーの投稿数が表示されるが、ユーザーがエントリーしている投稿を出せなくなる(users/show.html.erbにて 
<% @user.events.each do |event| %>

<h5 class="card-title"><%= event.title %></h5> <% end %>     としている)ため、こちらのshow.html.erbまで投稿数が表示されてしまう。 user.rbに has_many :events, through: :entriesを追加した場合は反対にどちらともそのユーザーがエントリーしている投稿の数になってしまう。

user.rbに
has_many :events, through: :entriesを追加したまま、index.html.erbに投稿数を表示させる方法がありますでしょうか?

補足

自分では、user.rbに
has_many :events, through: :entries を記述したことでエントリーを通っているため、実質的にentriesテーブルのuser_idに紐ずくevent_idの数を取得してしまっているのではないかと仮説を立てて見ました、、、

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

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

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

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

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

m.ts10806

2021/02/24 07:02

一つ前の質問で指摘したことですが、繰り返します。 マークダウンのcode内では他のマークダウンは無効になるので外に出してください。投稿前にプレビュー確認すればわかるはず。 あと、code内は「コード」のみを提示してください。それ以外はノイズになります。 質問は編集できます。 そして、半永久的に残ります。 適切に投稿されてないまま残るのは誰の参考にもなりません。
kokemaru2427

2021/02/24 07:17

ご指摘ありがとうございます。アドバイスをいただき、プレビューを見ながら記述を行ったのですが、ノイズになっていなかったため、投稿してしまいました。 #省略 という記述の#は マークダウン内のマークダウンになるため、それを外に出さなくてはいけないということでしょうか? そして、コード以外の文字すなわち、#省略の 「省略」はコードではないため、これもコード内にあってはいけないという認識で誤りはないでしょうか?
m.ts10806

2021/02/24 07:26

実際のコードに入っていないものはノイズです。コピペで動作確認できません。  (users_controller.rb) とか。 それに、前もですが、データベース・テーブル情報のところに画像入れてるつもりなんですよね? 出てないはずです。 code機能内では別のマークダウンは無効になります。
kokemaru2427

2021/02/24 08:18

こちらの投稿を編集してみました。言われて通り画像は表示されておらず、コードにはコードのみを記載という意味が理解できました。ありがとうございます。#省略に関しては#をコードの中で使えるため、残しておいて大丈夫なのかなと判断し残しましたが、これも無い方が良いのでしょうか?
guest

回答2

0

usersコントローラーshowに、
新たに@entry_events = @user.entried_eventsを追加し、
user.rbモデルを
has_many :entried_events, source: :event, through: :entriesに更新
show.html.erbに、エントリー済みの投稿を全て持ってくるという記述
<% @entry_events.each do |e_event| %>
<% end %>
としたところ、自分の投稿と、エントリーしている投稿の両方をとってくることに成功しました。
今思えば、自分の投稿とエントリーした投稿は、全く別の投稿にもかかわらず、同じ@eventsの中に定義していたため、どちらかに揃えても、両方が自分の投稿になっていた。
別の@entry_eventsにエントリー済みの投稿を格納することで、問題は解決しました。

投稿2021/03/01 02:54

kokemaru2427

総合スコア8

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

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

0

ベストアンサー

has_many :events
has_many :entried_events, class_name: 'Event', through: :entries
の2つが必要ですね。

投稿2021/02/24 07:33

編集2021/02/24 07:35
winterboum

総合スコア23567

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

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

kokemaru2427

2021/02/24 08:06

回答ありがとうございます。 User.rbをhas_many :events, dependent: :destroyの方は記入していたため、 has_many :entried_events, class_name: 'Event', through: :entriesをその直下に記述してみましたが、やはりエントリー数は表示されるのですが、user/index.html.erbの投稿数も、エントリー数になってしまいました。 has_many :events, dependent: :destroy has_many :entried_events, class_name: 'Event', through: :entries has_many :comments, dependent: :destroy has_many :entries, dependent: :destroy has_many :events, through: :entries また、わからないなりに考えたところ、順番にも関係があるのではないかと考え、入れ替えを行ってみましたが、やはり投稿数と、エントリー数のどちらか片方しか表示することができませんでした、、、 この記述の仕方に誤りがありますでしょうか?
winterboum

2021/02/24 08:34

最後の has_many :events, through: :entries が余分です
kokemaru2427

2021/02/24 10:09

ありがとうございます。修正した結果、ユーザー一覧ページでは(users/index.html.erb)投稿数を表示でき、ユーザー詳細ページでは(users/show.html.erb)エントリー数を表示することに成功しました。しかし今度は、ユーザー詳細ページ(users/show.html.erb)に表示させていた、エントリー中の投稿を表示させていたのですが、それが全て自分の投稿した投稿が表示されてしまいました。 (show.html.erb) <% if @user.id == current_user.id %> <h3 class="mt-3">あなたがエントリー中のイベント</h3> <% @events.each do |event| %> <h5 class="card-title"><%= event.title %></h5> <% end %> <% end %> <% end %> (users_controller.rb) def show @user = User.find(params[:id]) @events = Event.all @entries = Entry.all end そのユーザーが投稿した投稿ではなく、エントリーした投稿を表示させたい時どのような記述をすれば情報をとってこれますでしょうか? 自分が考えた案としては、 <% @events.each do |event| %>のなかに<% current_user.id == event.entry.user_id %>(ログインしているユーザーとエントリーテーブルのuser_idが一致する投稿を表示させる)という条件を考えたのですが、entryが定義されていないためエラーが起きてしまいました。
winterboum

2021/02/24 10:20

そこ entried_events にしました?
kokemaru2427

2021/02/24 12:16

has_many :events, dependent: :destroy has_many :entried_events, class_name: 'Event', through: :entries has_many :comments, dependent: :destroy has_many :entries, dependent: :destroy としているのですが、、、 has_many :entried_events, class_name: 'Event', through: :entries ですよね?
winterboum

2021/02/24 14:59

そこ とは 「ユーザー詳細ページ(users/show.html.erb)に表示させていた、エントリー中の投稿を表示させていたのですが、それが全て自分の投稿した投稿が表示されてしまいました。」のところです。 @events = Event.all ではなく @events = @user.entried_events
kokemaru2427

2021/02/25 01:29

def show  @user = User.find(params[:id]) @events = @user.entried_events @entries = Entry.all end 2行目を @events = Event.all から @events = @user.entried_events に変更しました。 すると変更箇所で、 ActiveRecord::HasManyThroughSourceAssociationNotFoundError in UsersController#show Could not find the source association(s) "entried_event" or :entried_events in model Entry. Try 'has_many :entried_events, :through => :entries, :source => <name>'. Is it one of user or event? というエラーが出ました。英文から、エントリーモデルにhas_many :entried_events, class_name: 'Event', through: :entries のようなアソシエーションを記述してみたのですが、 ActiveRecord::HasManyThroughOrderError in UsersController#show Cannot have a has_many :through association 'User#entried_events' which goes through 'User#entries' before the through association is defined. という、アソシエーションの順番がおかしいというエラーが出てしまいました。
winterboum

2021/02/25 11:14

順序をそのようにしてみてください
kokemaru2427

2021/03/01 02:47

winterboumさん、最後まで親身にアドバイスをいただきありがとうございました。 解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問