🥝

【Rails】attributes_in_databaseなどの挙動

2023/12/22に公開

遭遇した問題

validationメソッド内で、新規作成時はnil、更新時は更新前の値を返してほしく、attribute_in_databaseを使ったところ、まだ保存していないはずなのに値が返されてしまう現象が発生し、しばらく悩まされました。

article = Article.new(status_id: 1)
p article.status_id_in_database
# => 1 (nilを返してほしい)

原因

原因は簡単でDB側でカラムにデフォルト値として1を設定していたからでした。アサインした値とデフォルト値が一緒だったためアサインした値が返されるように見えていましたが、実際はこういうことでした。

# カラムのデフォルト値として1を設定
article = Article.new(status_id: 2)
p article.status_id
# => 2 (アサインした値)
p article.status_id_in_database
# => 1 (デフォルト値)

まだ保存していないのにattribute_in_databaseで値が取れるのは違和感がなくもないですが、挙動としては納得。

環境

Rails 7.0
Ruby 3.2.2

Discussion