2

我有一个模型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

因此,如果我调用保存,则会调用它。理想情况下,这里不会有不必要的数据库交互。

@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在该方法中添加一个可以修复它 - 但我想知道是否有其他人以前看过这个/一个修复?

4

2 回答 2

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 
于 2012-08-19T13:27:22.813 回答
0

这似乎是一个错误。

有趣的是,根据代码,如果你这样做:

@day.lunch_minutes = '0'

它可能会认为它没有改变!

试试看,如果这个变化确实会导致@day.lunch_minutes_changed?为假,然后确保将其作为问题报告给https://github.com/rails/rails

于 2012-08-19T13:21:23.427 回答