読者です 読者をやめる 読者になる 読者になる

【Rails】belongs_toで紐付けたモデルの存在チェック

belongs_toで紐付けたモデルが本当にデータとして存在するかどうかをチェックする。

class Blog
  has_many :comments
end
class Comment
  belongs_to :blog
end

例えば、このようなモデルがあった時、Blogモデル経由でCommentを作成した場合は、すでにBlogは存在しているので、comment.blog_idには確実に存在しているBlogのIDが入ります。

Blog.first.comments.create
# 存在しているブログからコメントを作成する

ですが、Blogモデル経由ではなくCommentを直接作成するとき、Blogと紐付けるためにはBlogのIDを外側から指定しないといけません。

Comment.create(blog_id: 1)
# コメントの作成時にblog_idを指定する

この方法で作成する時、特に設定しないままだと存在しないBlogのIDも指定できてしまいます。

Comment.create(blog_id: 999)
# IDが999のBlogは存在しないが、Commentは作成できてしまう

参照先の指定したIDのデータが存在しない場合にエラーを投げるにはValidateを設定する必要があります。

class Comment
  belongs_to :blog

  validates_presence_of :blog
end

validates_presence_ofで対象を指定すれば、参照先のデータが存在しない場合はエラーになり、データは作成されなくなります。