私は、最後の更新タイムスタンプの列を持つレガシーテーブルを持っています。 これでモデルに、rails属性updated_atが従来の列にマップされていることを伝えたいと思います。Rails3タイムスタンプからレガシーテーブルへのマッピング
ここで列にアクセスできますが、オブジェクトを更新すると更新されません。 これで、レールタイムスタンプをレガシーカラムで使用するにはどうすればいいですか? ベスト、 P
私は、最後の更新タイムスタンプの列を持つレガシーテーブルを持っています。 これでモデルに、rails属性updated_atが従来の列にマップされていることを伝えたいと思います。Rails3タイムスタンプからレガシーテーブルへのマッピング
ここで列にアクセスできますが、オブジェクトを更新すると更新されません。 これで、レールタイムスタンプをレガシーカラムで使用するにはどうすればいいですか? ベスト、 P
それを行うための「正しい」方法がありますかどうかは知りませんが、モデル上のbefore_saveまたはbefore_updateフィルタでそれを行うことができます。
class LegacyModel < ActiveRecord::Base
before_update :update_lastcall
private
def update_lastcall
self.lastcall = Time.now
end
end
モデルを乱雑にしたくない場合は、オブザーバーに入れることができます。
これを追加してください。これはセッターメソッドのエイリアスです。
alias_attribute :updated_at=, :lastcall=
私は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
、私は推測しています)。あなたのモデルでのマッキングは必要ありません。
私はそれを解決しましたが、タイムスタンプフィールドを独自のdbカラムにマッピングすることで別の解決策があるかもしれないと考えました – dc10