2012-04-20 7 views
0

Ok ..だから、変更の指標として日付を使用する場合は上司がいる。彼はそれを信じていない。変更された状態を常に保存するためのレンダリング

私がしたいことは、アクティブなレコードでネイティブになる日付更新と同じように動作しますが、その代わりに常に増加する数字に基づいています。 私は知っています... 1973年以来の秒数あなたが夏時間や物事を数えるのでなければ、絶えず大きくなっています。

これを正常に行う方法については、何か考えがあるかどうか疑問に思っています。 メモこれを必要とする20のテーブルがあり、DRYの大きなファンです。

答えて

2

http://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.htmlをご覧ください。これはまさにあなたが望むものだと思います。

ActiveRecord内のオプティミスティックロックとは、lock_version列が特定のテーブルに存在する場合、そのレコードを変更するたびに(ActiveRecord経由で)更新されます(+1)ことを意味します。

+0

いいえ..それは正しいです。しかし、それはロックと編集用です。私はフラグとして編集された日付を使用していると思われます、そして、保存しようとすると、レコードの日付レコードをロードしたときと同じです。スマートで、他の問題についても心に留めておきます...ありがとうございます。 – baash05

+0

データベーステーブル内にlock_versionカラムが存在する場合、Railsは行に加えられた変更ごとにそのカラムを+1で更新します。 updated_at、afaikとは関係ありません。 – moritz

+0

私はlock_versionと別のフィールドlast_exported_lock_versionを使って、新しいレコードを見つけるのを助けることができました。甘い答えです。もし私がまだ何かを実装していないのであれば、私はおそらくこの考えを使うでしょう。 – baash05

0

データベース内でマス・トリガーを使用しました。 この関数は、data_changedという新しいテーブルにレコードを作成(または更新)します。

def create_trigger_function(schema) 
    puts "DAVE: creating trigger function for tenant|schema #{schema.to_s}" 
    sql = "CREATE OR REPLACE FUNCTION \""+schema+"\".insert_into_delta_table() RETURNS TRIGGER AS 'BEGIN 
      UPDATE \""+schema+"\".data_changes SET status = 1, created_at = now() where table_name = TG_TABLE_NAME and record_id = NEW.id; 
      INSERT INTO \""+schema+"\".data_changes (status, table_name, market_id, record_id, created_at) 
               (select m.* from \""+schema+"\".data_changes as ds right outer join 
                (select 1, CAST (TG_TABLE_NAME AS text) as name , markets.id, NEW.id as record_id, now() from \""+schema+"\".markets) as m 
                on 
                ds.record_id = m.record_id 
                and ds.market_id = m.id 
                and table_name = name 
                where ds.id is null);     
      RETURN NULL; 
      END;' LANGUAGE plpgsql;"  
    connection.execute(sql); 
    end 

は今、私が変更されたすべての「製品」を見つけるためにしなければならないすべては、私は私の最初の更新を行った後、製品が更新された場合

update data_changes set status = 2 where status = 1 and table_name = 'products' 
select * from products where id in (select record_id from data_changes where status = 2 and table_name = 'products') 
update data_changes set status = 3 where status = 2 and table_name = 'products' 

ですが、私はそれを、選択を行う前に、 IDは1にリセットされるので、私の選択には表示されません。
選択した後に製品が更新された場合、最後の更新を行う前に、最後に影響を受けることはありません更新。

私のセレクトの内容は期限切れですが、それを回避する実際の方法はありません。

+0

ああ..多くの異なる「市場」のために輸出を追跡しなければならないので、私はlock_versionアプローチをとることができませんでしたが、それはクールでした。 – baash05