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

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

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

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

Ruby

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

747閲覧

【Ruby on Rails】関連づけすると、レコードが作成できない

soft_admin

総合スコア63

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/01/22 12:12

編集2020/01/22 14:47

前提・実現したいこと

UserとTweetのモデル1対多で関連付けをしたうえでデータを登録しようとすると、エラーが発生します。

["Userを入力してください"]

該当のソースコード

ruby

1#### controllers/tweets_controller.rb 2class TweetsController < ApplicationController 3 4 def new 5 @tweet = current_user.tweets.new 6 end 7 8 def create 9 @tweet = current_user.tweets.new(tweet_params) 10 @tweet.tweet_id = SecureRandom.hex(10) 11 if @tweet.save 12 redirect_to root_path, notice: "ツイートしました" 13 else 14 pp @tweet.errors.full_messages #### ここでエラーが発生。 15 render :new 16 end 17 end 18 19 def show 20 end 21 22 private 23 24 def tweet_params 25 params.require(:tweet).permit(:tweet_body) 26 end 27end

ruby

1#### models/user.rb 2class User < ApplicationRecord 3 has_many :tweets, primary_key: :id, foreign_key: :created_user_id 4end

ruby

1#### models/tweet.rb 2class Tweet < ApplicationRecord 3 belongs_to :user, primary_key: :tweet_id, foreign_key: :id 4end

current_userでログインユーザー(Userモデル)を取得しています。
テーブルは

・User

iduser_namecreated_atupdated_at

・Tweet
|id|tweet_id|tweet_body|created_user_id|created_at|updated_at|
|:--|:--:|--:|--:|--:|

となっています。
Tweetのcreated_user_idに、作成したUserのidを保存する前提です。

追記:
Tweetモデルのtweet_idがTweetテーブルのFKにしたいと思います。外に見える部分なので連番にしたくないからです。

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

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

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

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

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

guest

回答2

0

自己解決

どうすればよいのか分かりません。

投稿2020/01/22 14:24

編集2020/01/23 13:59
soft_admin

総合スコア63

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

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

maisumakun

2020/01/22 14:27

おそらくそれは、意図したリレーションではないかと思います。
soft_admin

2020/01/22 14:36

primary_keyをtweet_idにしていたのが問題だったのではないのでしょうか?
maisumakun

2020/01/22 14:38

> primary_keyをtweet_idにしていたのが問題だったのではないのでしょうか? 確かに、それ「も」問題です。ただ、ほかにも設定しないと「id同士でリレーション」ということになります。
soft_admin

2020/01/22 14:44

できればそのあたりをご教授いただけないでしょうか?
soft_admin

2020/01/22 14:47

漏れがあったので追記しました。
soft_admin

2020/01/22 15:36 編集

primary_keyの指定はやはり必要でしょうか?
guest

0

Tweetのcreated_user_idに、作成したUserのidを保存する前提です。

でしたら、Tweetbelongs_toを正しく宣言してください。このままだと、「tweets.tweet_idusers.idを結ぶ」という意味になってしまいます。

投稿2020/01/22 12:55

maisumakun

総合スコア145184

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

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

soft_admin

2020/01/22 13:51

どういうことでしょうか? tweetのprimary_keyをidに変更するのでしょうか?
maisumakun

2020/01/22 13:54

> tweetのprimary_keyをidに変更するのでしょうか? それをすると、「tweets.idとusers.idを結ぶ」という意味になります。
soft_admin

2020/01/22 14:10 編集

できれば具体的に教えていただきたいのですが。。。
maisumakun

2020/01/22 14:09

> 今のままだとUserのhas_manyもおかしいですよね? いえ、has_many側の設定はこのままで正しいかと思います。
soft_admin

2020/01/22 14:12

primary_key=belongs_toで指定しているモデルのPK foreign_key=belongs_toで指定した、foreign_keyと紐づけるキー という認識なのですが、まちがいでしょうか?
maisumakun

2020/01/22 14:18

> という認識なのですが、まちがいでしょうか? 先程挙げた「詳細」と同じページにhas_manyの詳細も載っていますので、そちらを確認してからお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問