我有一个名为Day
的模型,代表时间表中的一天。我注意到,每当我调用@day.save
它正在写入数据库时,即使对象的属性都没有更改它们的值。
@day = Day.last
=> #<Day lunch_minutes: 0, updated_at: "2012-08-19 12:09:40", work_hours: 5.5>
一天的长度以小时为单位,午餐时间以分钟为单位,存储起来。我已经裁掉了一些不相关的属性。
@day.lunch_minutes
=> 0
@day.lunch_minutes = 0
=> 0
@day.changes
=> {"lunch_minutes"=>[0, 0]}
@day.lunch_minutes_changed?
=> true
那应该是假的。与不为零的值进行比较:
@day.work_hours = 5.5
=> 5.5
@day.work_hours_changed?
=> false
因此,如果我调用save,则会调用它。理想情况下,这里不会有不必要的数据库交互。
@day.save
(0.5ms) UPDATE "days" SET "lunch_minutes" = 0, "updated_at" = '2012-08-19 12:22:59.586860' WHERE "days"."id" = 48
我不确定这是否是一个Rails错误,或者我是否在某处做错了。它似乎可能是"changes_from_zero_to_string?"中的一个问题 - 我认为在该方法中添加&& value != 0
会修复它 - 但我想知道是否有其他人之前已经看过这个/一个修复程序?< / p>
答案 0 :(得分:1)
您使用的是哪种版本的导轨?我只是在我的应用程序(3.1.5 / 1.8.7)中进行了操作并且它没有这样做..我只是在我的一个模型上使用随机整数属性来测试:
1.8.7 :006 > o = Order.first
=> <Order id:...>
1.8.7 :007 > o.order_items_count
=> 0
1.8.7 :008 > o.order_items_count = 0
=> 0
1.8.7 :009 > o.changes
=> {}
1.8.7 :010 > o.order_items_count = '0'
=> "0"
1.8.7 :011 > o.changes
=> {}
1.8.7 :012 > o.save
(0.1ms) BEGIN
(0.1ms) COMMIT
=> true
答案 1 :(得分:0)
这似乎是一个错误。
有趣的是,根据代码,如果你这样做:
@day.lunch_minutes = '0'
它可能会认为它没有改变!
尝试一下,如果确实这种变化会导致@ day.lunch_minutes_changed?如果是假的,请确保将其报告为https://github.com/rails/rails的问题。