当旧值和新值都是数字零时,ActiveRecord对象标记为脏

时间:2012-08-19 12:58:08

标签: ruby-on-rails activerecord

我有一个名为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>

2 个答案:

答案 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的问题。