Rails:在单个事务中保存模型关联

时间:2013-12-13 11:14:00

标签: ruby-on-rails database activerecord

我遇到了updated_at列的麻烦,在同一个事务中似乎不相同:

@my_model = FactoryGirl.build(:my_model_bare)
@my_model.first_assoc = FactoryGirl.build(:first_assoc_sample)
@my_model.second_assoc = FactoryGirl.build(:second_assoc_sample)
@my_model.save!
puts @my_model.first_assoc.updated_at.iso8601(3)
puts @my_model.second_assoc.updated_at.iso8601(3)

最后,first_assoc.updated_at != second_assoc.updated_at即使两个模型都保存在同一个交易中!?

如何强制updated_at对于事务内的所有操作都相同?这是一个mysql问题吗?

2 个答案:

答案 0 :(得分:1)

'created_at'和'updated_at'列由Rails填充。

当您使用FactoryGirl时,我假设您需要将其用于测试目的。基于此,请看一下TimeCop gem:

https://github.com/travisjeffery/timecop

Timecop可以冻结时间。

如果您确实需要手动设置created_at和updated_at次数,则可以为它们分配值:

current_time = Time.now

@my_model.created_at = current_time
@my_model.updated_at = current_time

您还需要手动设置任何相关对象的值

答案 1 :(得分:0)

ActiveRecord使用ms在datetime中设置updated_at。所以他们不会平等。 如需查看,您可以使用:

Rails.logger.info @model.updated_at.to_i

您始终可以手动更新update_at