Design question about versions/revisions with a deep hierarchy

Hi,

I have a design question about the best way to support versions/
revisions (BTW, not sure which term is appropriate for this?) of a
somewhat deep hierarchy of models within a CMS type system. For
example let’s say I wanted to store information about classes and so I
had:

course
chapter
lecture

with has_many relationships (course has_many chapters, chapter
has_many lectures), and each level has some amount of meta data with
it (Title for most of them, perhaps abstract, etc.). I’d like to
allow a person entering information to do things like snapshot a
chapter and save off a version/revision, which would be the chapter
and the lectures under it, or snapshot just a lecture or snapshot a
whole course. Whichever level they snapshot at that should be a
version/revision and so you’d only affect it and the items below it
when you’re editing that version/revision. You’d do things like save
a version of the chapter, make profound effects, decide if you like
them, possibly go back and use the old version, then use the new
version in a new version of the course, etc.

I’ve poked around a fair amount at various version plugins, but they
all seem focused on versioning a single table and doing so in a
separate version table (or tables); in this example when you make a
‘version’ of chapter, you really want to also copy all the lectures,
set the foreign keys right, etc. and you (might?) want to leave the
versions in their original tables both for editing them (so that you
don’t have to do hackery to AR to make it use the table
courses_versions sometimes) and so that if you have instance records
(i.e. user_course) they point to the actual version/revision they
took.

I’m looking for feedback on a) any flaws in my original problem and
how I understand the general solution (i.e. am I confused), b) any
suggestions on plugins solutions that already solve this, and/or c)
any common patterns people use to solve this that I should use when/if
I need to implement on my own.

Thanks,
\Peter