【问题标题】:ruby activerecord how to use alternate updated_at columnruby activerecord如何使用备用updated_at列
【发布时间】:2011-07-07 14:01:04
【问题描述】:

我正在尝试将 Rails3 与现有的数据库架构一起使用。时间戳字段updated_at和created_at需要映射到db上created和modified。

有没有办法告诉 activerecord 使用备用列名?

提前致谢,克里斯

编辑

是否可以通过在模型目录中的文件中完成此操作:

module ActiveRecord

  module Timestamp
    def timestamp_attributes_for_update #:nodoc:
      [:modified, :updated_on]
    end

    def timestamp_attributes_for_create #:nodoc:
      [:created, :created_on]
    end
  end

end

【问题讨论】:

  • 嗯 - 想知道 Chuck 覆盖 created_at/updated_at 的答案发生了什么 - 似乎对我有用,也许我错过了什么......
  • 请停止使用猴子补丁。这是一个更好的方法:stackoverflow.com/a/13457972/264409

标签: ruby ruby-on-rails-3 activerecord


【解决方案1】:

我认为没有在ActiveRecord:: Timestamp 中覆盖timestamp_attributes_for_update 的方法。

一个简单的解决方法是在模型中使用before_update 回调。

before_update :set_modified_time

private
  def set_modified_time
    self.modified = Time.now
  end

【讨论】:

  • 您还需要一个before_save 回调。你是对的,如果不覆盖 ActiveRecord::Timestamp 是不可能的,因为列名在那里是硬编码的。
  • 您不一定需要使用before_save,如果您确实使用了它,您可以使用它来代替before_update,因为在这两种情况下都会调用它。我想这取决于数据库中的列是否默认将其设置为当前时间,或者如果尚未修改,您是否希望它为零,但@Chris 在他的问题中没有提到这一点。
  • 我该如何处理最重要的 timestamp_attributes_for_update 选项 - 在模型目录中有一个文件是否足够:请参阅问题编辑...
  • @Chris,你的问题可以正常工作,但我会把它放在初始化程序或 lib 中,并在 application.rb 中需要它。 @Andrew,对不起,我刚刚意识到我完全错过了他也想设置 created 属性。道歉。
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2019-05-18
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多