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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

2回答

731閲覧

modelとmodelの紐付けで質問があります。

jyon3030

総合スコア11

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/11/18 08:53

編集2019/11/19 07:22

実現したいこと

modelとmodelを紐付けする際に親modelに対して複数のmodelを紐付けたいです

現状で困っていること

親クラス(User)に対して子クラス(Attenbdance)、(Base)の二つのクラスを紐付けしたいのですが、has_manyとbelongs_toの記述の仕方がわかりません。親クラス(User)に対して子クラスである(Attendance)は紐付けることができているのですがBaseクラスが上手くいきません。汗
この記述の仕方で紐づけることができるでしょうか?
お手数ですがご教授いただけないでしょうか。。

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

ActionController::UrlGenerationError in StaticPages#top Showing /home/ec2-user/environment/kintai_A/app/views/layouts/_header.html.erb where line #10 raised: No route matches {:action=>"show", :controller=>"bases", :id=>nil, :user_id=>"1"}, missing required keys: [:id] Extracted source (around line #10): <li><%= link_to "test", user_basis_path(current_user, @base) %></li>

該当のソースコード

ruby

1# 親クラス 2class User < ApplicationRecord 3 has_many :attendances, dependent: :destroy 4 has_many :bases, dependent: :destroy 5 6# 子クラス 7class Base < ApplicationRecord 8 belongs_to :user 9end 10 11 12class Attendance < ApplicationRecord 13 belongs_to :user 14 15 16 17コントローラー 18class BasesController < ApplicationController 19 20 def show 21 @base = Base.find(params[:id]) 22 end 23 24 25ルーティング 26user_basis GET /users/:user_id/bases/:id(.:format) bases#show

試したこと

エラー箇所

<li><%= link_to "test", user_basis_path(current_user, @base) %></li> _     ⬇︎ _ @baseを1に変えたらshowページが表示されます

def show
@base = Base.find(params[:id])
end

コントローラでidが取得出来ていないみたいです。

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

モデルの関連付に関しては(1対多)や(多対多)の関係性があるのは知っているのですが、私のイメージとしてはこのような形にしたいです。
_              Attendance(子クラス)
_              ↗️ .userに紐づいたAttendanceのレコード
_ User(親クラス)⇨⇨⇨   user_idで紐づける  
_               ↘︎
_                 Base(子クラス)
_                 .userに紐づいたBaseのレコード
_                 user_idで紐づける
_
_
_
_
_ 無理ならUserモデルを間に挟んでそれぞれのIDを持たせるしか方法はないのでしょうか。。
_ (has_many throughの形)

_ Attendance --------------------- User ---------------------- Base 
_         ・attendance_id
_ ・base_id

                    
分かりにくくてすいません。汗

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

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

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

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

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

winterboum

2019/11/19 00:50

うまく行かない、というのは どうなることを期待しているのに どうなってしまう のでしょうか
jyon3030

2019/11/19 02:11

忙しい中回答ありがとうございます!汗 Userモデル(1) 対 Attendanceモデル(多)の関係 Userモデル(1) 対 Baseモデル(多)の関係 このような関係性を期待しているのですが、AttendanceモデルはUserモデルと紐づけることはできたのに、Baseモデルは記載したコードの書き方では紐づけることができなくて困っています。 そもそもカラムを追加したいだけだったのですが、元々あったAttendanceモデルにカラムを追加してしまうと整理しにくいと思ったので、Baseモデルを作成しそこにカラムを追加しました。それによって ユーザーに紐空いたAttendanceのレコードの作成 ユーザーに紐づいたBaseレコードの作成 と分けたかったのですが、、、 長文になってしまい申し訳ありません汗
winterboum

2019/11/19 02:36

紐づけることができない というのは具体的には、どうなってしまうのでしょうか。 だめだ、と判断した経緯を code、エラーメッセージ、DB検索の結果などでは説明難しいですか
jyon3030

2019/11/19 07:02

コメント欄で見辛くて申し訳ありません。汗 headerのリンク欄からbasesコントローラーのshowアクションでリンクを作成。 リンクをクリックすると以下のようなエラーが出ます。 id=>nilでエラーが出ているのは分かっているので、basesコントローラーのshowアクションでidを取得しようとしても出来ません、、 以上のことから紐付けがそもそも出来ていないのかと思いました、、汗 ActionController::UrlGenerationError in StaticPages#top No route matches {:action=>"show", :controller=>"bases", :id=>nil, :user_id=>"1"}, missing required keys: [:id] <li><%= link_to "test", user_basis_path(current_user, @base) %></li> class BasesController < ApplicationController def show @base = Base.find(params[:id]) end user_basis GET /users/:user_id/bases/:id(.:format) bases#show
guest

回答2

0

1つ考えられることとして、Baseという名前が悪いのではないか、ということがあります。

ActiveRecordの基底クラスがActiveRecord::Baseという名前なので、間違えてそっちを読んでいる、ということが考えられます。

投稿2019/11/18 09:02

maisumakun

総合スコア145963

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

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

0

maisumakunさんの言われるように Baseが悪さをしている可能性もありますが、ActiveRecord::BaseでなくBaseで呼んで居ますのでそうではない可能性もあります。

コメント欄でのやり取りから感じたのは、連携できていない のと linkが思わしくないのとを混同している、ということです。

まず、連携ができているのかどうかを確かめましょう。
rails c でconsoleを開き(bundle execを付けないと駄目かも)
user=User.first
base=user.bases.create(ここに必要なデータを)
として、
User.first.bases
としたらどうなりますか?

投稿2019/11/19 07:36

winterboum

総合スコア23567

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

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

jyon3030

2019/11/19 08:22 編集

何度も本当にありがとうございます。 早速試してみました! bundle exec rails c -s でコンソール起動 user = User.first ⬅️ userに代入できました base = user.bases.create(base_name: "test", base_number: 1, base_kind: "test", user_id: 1) ここで以下のようなエラーになります Traceback (most recent call last): 1: from (irb):3 NameError (uninitialized constant User::Basis) 紐付けがすでに出来ていないという事でしょうかね、、
winterboum

2019/11/19 08:33

いや、定数未定義のエラーですね。 しかし、、、 uninitialized constant User::Basis Basis とか basis とかの文字列が どっかにありませんか? basesのtypoだと思いますが。
winterboum

2019/11/19 08:37

ああ、判った。 複数形 bases の単数形が basis とみなされたんですね。 has_many :bases, class_name "Base", dependent: :destroy として、rails c をやり直してみて下さい
jyon3030

2019/11/19 09:06

本当にありがとうございます汗 おっしゃる通りclass_name: "Base" にして試した所、変数のbaseに代入できました! base = user.bases.create(base_name: "test", base_kind: "test", base_number: 1, user_id: 1) User.first.bases コマンドを実行した所 User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]] Base Load (0.1ms) SELECT "bases".* FROM "bases" WHERE "bases"."user_id" = ? LIMIT ? [["user_id", 1], ["LIMIT", 11]] => #<ActiveRecord::Associations::CollectionProxy [#<Base id: 1, base_number: 1, base_name: "test", base_kind: "test", user_id: 1, created_at: "2019-11-19 06:24:35", updated_at: "2019-11-19 06:24:35">, #<Base id: 2, base_number: 1, base_name: "test", base_kind: "test", user_id: 1, created_at: "2019-11-19 08:56:21", updated_at: "2019-11-19 08:56:21">]> 長文すいません、、、 以上のような結果が返ってきました。
winterboum

2019/11/19 09:13

ということでひも付けはできました。次はlinkが通るように、ですね。 言葉で質問しても情報が足りません。 具体的なcodeなどの情報をつけるようにして下さい。 問題を一緒くたにしないで、段階を踏んで問題点を見つけるようにしましょう
jyon3030

2019/11/19 09:23

何度も本当にありがとうございます! ここまでしてもらっただけでも本当に助かりました! 確かにコードをみないとどうしようもないですよね。。 has_many class_name: ""というやり方やモデルの名前に関してもかなり勉強になりました! 次質問する事があった場合はコードの情報も具体的に記載しつつ、もっと分かりやすい質問の仕方を心がけます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問