【问题标题】:Rails3 timestamp mapping to legacy tableRails3 时间戳映射到旧表
【发布时间】:2011-10-01 21:24:35
【问题描述】:

我有一个旧表,其中包含最后更新时间戳的列。 现在我想告诉我的模型,rails 属性 updated_at 已映射到旧列。

alias_attribute :updated_at, :lastcall

现在我可以访问该列,但是当我更新对象时它没有得到更新。 那么如何将 Rails 时间戳与旧列一起使用? 最好的, P

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我不知道是否有“正确”的做法,但您可以在模型上使用 before_save 或 before_update 过滤器。

    class LegacyModel < ActiveRecord::Base
      before_update :update_lastcall
    
      private
    
      def update_lastcall
        self.lastcall = Time.now
      end
    
    end
    

    如果您不想让模型变得凌乱,可以将其放入 Observer。

    【讨论】:

    • 嘿,这就是我解决它的方式,但它认为通过将时间戳字段映射到您自己的数据库列可能还有另一种解决方案
    【解决方案2】:

    也尝试添加它,这将为 setter 方法设置别名。

    alias_attribute :updated_at=, :lastcall=
    

    【讨论】:

      【解决方案3】:

      我也想draw your attention to this,如果您的时间戳列名称是站点范围的(就像我的一样)。我不想弄乱我的模型,幸运的是,你可以猴子补丁ActiveRecord::Timestamp。我将以下内容放入名为lib/rails_ext/active_record.rb 的目录中(我是一个组织怪胎),并在config/initializers/ 的一个初始化程序中使用require 'rails_ext/active_record' 声明调用它。

      module ActiveRecord
        module Timestamp
          private
          def timestamp_attributes_for_update #:nodoc:
            [:modified_time, :updated_at, :updated_on, :modified_at]
          end
          def timestamp_attributes_for_create #:nodoc:
            [:created_date, :created_at, :created_on]
          end
        end
      end
      

      我的自定义属性最终是:modified_time:created_date。您可以在其中之一中指定您的:lastcall 列(我假设是timestamp_attributes_for_update)。无需修改您的模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2012-01-21
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 2023-03-29
        相关资源
        最近更新 更多