2011-07-09 57 views
3

私は、最後の更新タイムスタンプの列を持つレガシーテーブルを持っています。 これでモデルに、rails属性updated_atが従来の列にマップされていることを伝えたいと思います。Rails3タイムスタンプからレガシーテーブルへのマッピング

ここで列にアクセスできますが、オブジェクトを更新すると更新されません。 これで、レールタイムスタンプをレガシーカラムで使用するにはどうすればいいですか? ベスト、 P

答えて

1

それを行うための「正しい」方法がありますかどうかは知りませんが、モデル上のbefore_saveまたはbefore_updateフィルタでそれを行うことができます。

class LegacyModel < ActiveRecord::Base 
    before_update :update_lastcall 

    private 

    def update_lastcall 
    self.lastcall = Time.now 
    end 

end 

モデルを乱雑にしたくない場合は、オブザーバーに入れることができます。

+0

私はそれを解決しましたが、タイムスタンプフィールドを独自のdbカラムにマッピングすることで別の解決策があるかもしれないと考えました – dc10

2

これを追加してください。これはセッターメソッドのエイリアスです。

alias_attribute :updated_at=, :lastcall= 
1

私は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、私は推測しています)。あなたのモデルでのマッキングは必要ありません。

関連する問題