LoginSignup
0
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-30

はじめに

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 ガイド

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2