Ruby 1.8.7 と Rails 2.3.5 を実行している Ruby on Rails アプリケーションのメンテナンスを行っています。使用するデータベースは MySQL です。
モデルの 1 つで非常に奇妙なバグに遭遇しました。保存する前は、id は nil です (データベースへの保存によってまだ割り当てられていないため)。次に、 @model.save を実行するとレコードがデータベースに保存されますが、@model.id を呼び出すと、データベースで割り当てられた ID (4000235410) ではなく、負の値 (-294731885) が返されます。
デバッグするために、以下を shopping_cart モデルに追加しました。
before_save :print_object_before
after_save :print_object_after
def print_object_before
logger.debug "ShoppingCartBeforeSave: " + self.inspect
end
def print_object_after
logger.debug "ShoppingCartAfterSave: " + self.inspect
end
私のコントローラーでは、次のように呼び出します。
@shopping_cart.save!
ログに出力される出力は次のとおりです。
ShoppingCartBeforeSave: #<ShoppingCart id: nil, user_id: 4000001127, created_at: nil, updated_at: nil, currency_code: "zar", coupon_code: nil>
ShoppingCartAfterSave: #<ShoppingCart id: -294731885, user_id: 4000001127, created_at: "2012-09-25 12:02:05", updated_at: "2012-09-25 12:02:05", currency_code: "zar", coupon_code: nil>
何が問題になる可能性がありますか?モデルで定義された他の前フィルターまたは後フィルターはありません。MySQL で ID が不足している可能性があると思いましたが、Rails で異なる値を返すにもかかわらず、データベースにレコードを正しく (正の ID で) 保存しているため、そうではありません。(参考までに、モデルの移行では、id は整数として定義されます。)
いくつかの詳細情報: 負の値の値が増加し続けているようです (より小さい負)。たとえば、1 回の試行では ID に -294731885 が含まれ、次の試行では -294731884 が含まれ、次の試行では -294731883 が含まれます。