Help us understand the problem. What is going on with this article?

【Rails】belongs_toで関連付けしたけどデータが保存出来ない →単数形にしてる?

はじめに

Railsアプリ作成中、belongs_toで関連付けたモデルのデータ保存がうまくいかず、はじかれてしまったので解決した方法です。

しょうもないミスでした:sweat_smile:

この記事が役に立つ方

  • belongs_toで関連付けはしたが、うまく保存が出来ない方

この記事のメリット

  • 無事にデータが保存出来るようになる。

環境

  • macOS Catalina 10.15.1
  • zsh: 5.7.1
  • Ruby: 2.6.5
  • Rails: 5.2.3

エラー内容

1対多の関係にある、UserモデルとRecordモデルがあるとします。

Recordテーブルのデータを新規作成し、save!でデータ保存しようとしたところ、以下のようなエラーが発生。

ActiveRecord::RecordInvalid: Validation failed: Users must exist

保存するデータには外部キーuser_idがあり、そこにはちゃんと値が入っていて、「あれ?なんで?」と困る。

このときのモデルは以下のように定義していました。

app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users
end

ここから応急処置(間違った解決法)とちゃんとした解決法を記載します。

1.応急処置(間違った解決法)

以下のように変更。

【Before】

app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users
end


【After】

app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users, optional: true
end

optional: trueで関連モデルなしでOK!と放し飼い状態にし、一旦。バリデーションを回避。

しかし、全く意味のない矛盾した設定になるのであくまでも応急処置。

割とググるとこの解決法が多かったですが、あまり良くないと思います。

2.解決(ただの設定ミス)

【Before】

app/models/record.rb
class Record < ApplicationRecord
  belongs_to :users, optional: true
end


【After】

app/models/record.rb
class Record < ApplicationRecord
  belongs_to :user
end

:x: 複数形
:o: 単数形

belongs_to関連付けで指定するモデル名は必ず「単数形」にしなければなりません。

Rails ガイドにもちゃんと書いてました!

英語で考えたら当たり前、お恥ずかしいです:tired_face:
optional: trueも不要なので削除。

これで問題なし!

おわりに

最後まで読んで頂きありがとうございました:bow_tone1:

しょうもない設定ミスで時間をロスしてしまったので、同じようなエラーで困っている方がいれば参考にして頂ければと思います:sweat_smile:

参考にさせて頂いたサイト(いつもありがとうございます)

Active Record の関連付け - Rails ガイド

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away