🥝
【Rails】attributes_in_databaseなどの挙動
遭遇した問題
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