データベース内でマス・トリガーを使用しました。 この関数は、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にリセットされるので、私の選択には表示されません。
選択した後に製品が更新された場合、最後の更新を行う前に、最後に影響を受けることはありません更新。
私のセレクトの内容は期限切れですが、それを回避する実際の方法はありません。
いいえ..それは正しいです。しかし、それはロックと編集用です。私はフラグとして編集された日付を使用していると思われます、そして、保存しようとすると、レコードの日付レコードをロードしたときと同じです。スマートで、他の問題についても心に留めておきます...ありがとうございます。 – baash05
データベーステーブル内にlock_versionカラムが存在する場合、Railsは行に加えられた変更ごとにそのカラムを+1で更新します。 updated_at、afaikとは関係ありません。 – moritz
私はlock_versionと別のフィールドlast_exported_lock_versionを使って、新しいレコードを見つけるのを助けることができました。甘い答えです。もし私がまだ何かを実装していないのであれば、私はおそらくこの考えを使うでしょう。 – baash05