カクカクしかじか

技術的なアレコレ

mongoidのtimeless.save関連のバグを見つけた備忘録

概要

mongoidには特定のインスタンスのtimestampを更新したくない時に、timestampだけ更新しないようにする仕組みがあります。
私は実務でActive Recordを使ったことがないので定かではないですが、Active Recordにも必ずあるはずです。
そのオプションを付与するメソッドはそのオプションを解除するメソッドとセットで実行していくのですが...
そのオプション解除メソッドを実行しても、timestampが更新されない状態が継続されるので、バグか?と思ったので本稿にメモとして記録しておきます。

具体的な挙動

検証バージョン
mongoid 5.4.0
mongodb 3.2

# 公式Documentにはuser.timeless.saveみたいな例があるが、その場合は、user.reloadを後続処理で入れないとtimestampの値がfreezeされなそう…(これもバグ?)
$ user = user.timeless

# updated_atが更新される
$ user.update(email: "hoge@hoge.com")
=> true

# こうするとtimestampの更新が行われなくなる
$ user = user.timeless
$ user.update(email: "hoge@hoge.com")
=> true

# しかし...
# 本来は user.clear_timeless_optionをすると解除されるはず...
$ user.clear_timeless_option
=> true

# ここでtimestampに関わる値が更新されなかった...
$ user.update(email: "hoge@hoge.com")
=> true

最後に

いずれ時間を作って、今回メモしたバグを解消するプルリクを送ってみたいと思います。
頑張るぞ!

参考

qiita.com

docs.mongodb.com