In the olden days we would do this sort of thing with db triggers and a
‘journal’ table–every UPDATE would result in a record_version field
being incremented, and the pre-update version of the rec written out to
a separate table. You can also keep all record versions in one table &
put up a view that selects out just the most recent, but that can be
problematic perf-wise. (IIRC, chunks of SAP do the
all-versions-in-one-table thing.)
Agree that an AR plugin should be able to handle the journaling–not
sure if there is one that does. I vaguely recall an ‘acts as
deleteable’ or ‘acts as archivable’ plugin discussed here a while back
that seems like similar functionality–not sure if it would get you all
the way there.
From: [email protected]
[mailto:[email protected]] On Behalf Of Patrick D.
Sent: Monday, December 15, 2008 12:26 PM
To: [email protected]
Subject: [Rails] Re: Saving a “final” version of a record.
On Mon, Dec 15, 2008 at 1:13 AM, Michael K.
<[email protected]mailto:[email protected]>
wrote:
I’ll start by apologizing for the title. I can’t think what to call
this.
I have some Claims that need to be entered, but when they are “closed”
it saves the data from other related tables into the Claim (this could
get messy), so that if the Customer, Registration, or Dealer information
is changed at a later date it will remain the same as when the Claim was
closed.
Is there a preferred method for doing this? Some kind of plugin or
something?
I understand I could have a separate table for keeping the “archived”
version of the record, but I fear the work to create all new tables and
then storing the record as this other new archive type which is nothing
more than a duplicate of the Claim.
Any thoughts?
P.S. - Ask away, I am probably not explaining this perfectly, but I will
try to elaborate if you are having trouble understanding my challenge.
I wonder if you could implement a “copy-on-write” feature in the
Customer, Registration, Dealer, etc… tables. Basically, add a
“freeze_record” boolean column to those tables and set that to “true”
when you need to finalize one of those records. If you ever want/need
to update a frozen record, you could allocate a new one, scan all of the
claims to which this record “belongs_to” and point all of those that are
not closed to the new record.
This strikes me as an ideal candidate for some sort of plugin that mixes
into ActiveRecord. Unfortunately, I haven’t the foggiest idea how to
implement the practical side of this theoretical solution (yet… but
I’m learning more every day).
–wpd