【问题标题】:created_at overwritten by save?created_at 被保存覆盖?
【发布时间】:2014-08-24 06:47:24
【问题描述】:

您好,我有一个继承自 ActiveRecord 的对象,我在初始化时传递了一个 created_at 字段。

o = Object.new(created_at: "2014-01-03 03:27:18")
o.save

当我检查o.created_at 时,它给了我Time.now 时间戳而不是我传入的时间。它不应该默认为我通过它的 created_at 字段吗?

【问题讨论】:

  • 您知道created_at 和updated_at 在创建/更新时通常由rails 设置吗?默认含义是记录创建或更新记录的时间。您真的要明确否决默认行为吗?否则我建议重命名您的字段。
  • 是的,我知道哈哈。我们之所以要推翻这一点是出于内部原因。也用于测试。
  • 好的,很难从一个简短的问题和一个相当新的用户中猜测专业水平:) 对于测试,我通常存根 Time.now 或使用像 timecop 这样的 gem。

标签: ruby-on-rails ruby validation date save


【解决方案1】:

created_on 字段在记录插入表时自动更新。您可以通过覆盖timestamp_attributes_for_update 方法来更改此设置:

class Object < ActiveRecord::Base

  before_save do
    self.created_at ||= DateTime.now
  end

  protected

  def timestamp_attributes_for_create
    [:updated_at]
  end
end

【讨论】:

  • 嘿,不幸的是,重写此方法似乎不会改变 :created_at 被覆盖。
  • 我尝试了def timestamp_attributes_for_created; [:updated_at];end 和def timestamp_attributes_for_created; [:created_at];end 都没有成功。
  • @user3358302 before_save 是一个例子,它仍然会覆盖created_at,所以在你的情况下你应该删除before_save(我想这很明显,但不确定你是否注意到它)。
  • @user3358302 - 打错了,应该是timestamp_attributes_for_create,最后没有d。我会更新答案。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2014-07-29
  • 2011-08-17
  • 2011-09-07
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多