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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

1804閲覧

中間テーブルの値をeach文を使って取得したい

daddy123

総合スコア1

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/11/18 10:09

前提・実現したいこと

テーブルの情報を全て取得し、取得した値に紐づいた中間テーブを経由して別のテーブルの値を取得する機能を実装中に以下のエラーメッセージが発生しました。

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

error

1NoMethodError

該当のソースコード

エラー発生箇所

html

1 <% @task.each do |g| %> 2 <p><%= g.genre_task.genre.user_id %></p> 3 <% end %>

該当箇所のコントローラー

controller

1def index 2 @task = Task.order(id: :DESC).all 3end

Genreモデル

model

1class Genre < ApplicationRecord 2 # validation 3 validates :name, presence: true 4 # association 5 belongs_to :user 6 has_many :tasks, through: :genre_tasks 7end

Taskモデル

model

1class Task < ApplicationRecord 2 # validation 3 validates :name, presence: true 4 # association 5 has_many :genres, through: :genre_tasks 6end

中間テーブルのモデル

model

1class GenreTask < ApplicationRecord 2 belongs_to :genre 3 belongs_to :task 4end

genresテーブル

ruby

1class CreateGenres < ActiveRecord::Migration[6.0] 2 def change 3 create_table :genres do |t| 4 t.text :text 5 t.string :name 6 t.references :user 7 t.timestamps 8 end 9 end 10end 11

tasksテーブル

ruby

1class CreateTasks < ActiveRecord::Migration[6.0] 2 def change 3 create_table :tasks do |t| 4 t.text :text 5 t.string :name 6 t.timestamps 7 end 8 end 9end

中間テーブル

ruby

1class CreateGenreTasks < ActiveRecord::Migration[6.0] 2 def change 3 create_table :genre_tasks do |t| 4 t.references :genre 5 t.references :task 6 t.timestamps 7 end 8 end 9end 10

試したこと

NoMethodErrorと表示されているので、指定しているメソッドが異なると考えネット上で検索をしました。しかしメソッドの指定の仕方を変更してもエラーは解消しませんでした。そこで別の原因もあるのではないかと考えコンソール上で中間テーブの値を取得しアソシエーションができているか確認をしました。

[1] pry(main)> @genre_task = GenreTask.find(1) GenreTask Load (0.4ms) SELECT `genre_tasks`.* FROM `genre_tasks` WHERE `genre_tasks`.`id` = 1 LIMIT 1 => #<GenreTask:0x00007fd038cadae0 id: 1, genre_id: 1, task_id: 1, created_at: Wed, 18 Nov 2020 09:29:14 UTC +00:00, updated_at: Wed, 18 Nov 2020 09:29:14 UTC +00:00> [2] pry(main)> @genre_task.genre Genre Load (0.3ms) SELECT `genres`.* FROM `genres` WHERE `genres`.`id` = 1 LIMIT 1 => #<Genre:0x00007fd03ea07bf0 id: 1, text: "test", name: "test", user_id: 1, created_at: Wed, 18 Nov 2020 09:29:04 UTC +00:00, updated_at: Wed, 18 Nov 2020 09:29:04 UTC +00:00>

そのためアソシエーションの値が取得できないわけではない事が分かりました。
なので中間テーブルの値の呼び出し方が間違っているとは思うのですが、どうすれば良いのか分かりません。

補足情報(FW/ツールのバージョンなど)

Ruby on Rails ver6.0.0
Ruby ver2.6

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

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

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

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

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

winterboum

2020/11/18 11:09

エラーメッセージは全文載せて
daddy123

2020/11/18 11:34 編集

申し訳ありませんでした ```ruby NoMethodError in Tasks#index Showing /Users/ryu/original/ori_app_tododo/app_tododo/app/views/tasks/index.html.erb where line #7 raised: undefined method `genre_task' for #<Task:0x00007f8fcda0e3a8> Did you mean? genre_ids genre_ids= ```
guest

回答1

0

ベストアンサー

Taks に has_many :genres, through: :genre_tasks しているので、genre_tasks というmethodはできていますが、単数形はありません。
Taskの復数のgenreのuserを得るのでしたら復数採るようにしなければ。

<% g.genres.each do |genre| %> <p><%= genre.user_id %></p>

ですね。
なお、Task に has_many :genre_tasks が必要です。

投稿2020/11/18 13:44

winterboum

総合スコア23329

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

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

daddy123

2020/11/18 19:31

無事値を取得することができました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問