Comment garder trace de l'histoire du modèle avec la table de mappage dans Ruby on Rails?

rêve

Je tiens à garder une trace de quand un utilisateur change son adresse.

De cette façon, quand une commande est passée, elle sera toujours en mesure de référencer l'adresse de l'utilisateur qui a été utilisé au moment de la passation de commande.

possible de schéma

users (
  id
  username
  email
  ...
)

user_addresses (
  id
  label
  line_1
  line_2
  city
  state
  zip
  ...
)

user_addresses_map (
  user_id
  user_address_id
  start_time
  end_time
)

orders (
  id
  user_id
  user_address_id
  order_status_id
  ...
  created_at
  updated_at
)

en sql, cela pourrait ressembler à quelque chose comme: [sql]

select ua.*

from  orders    o

join  users     u
  on  u.id = o.user_id

join  user_addressses_map   uam
  on  uam.user_id = u.id
  and uam.user_address_id = o.user_address_id

join  user_addresses        ua
  on  ua.id = uam.user_address_id
  and uam.start_time < o.created_at
  and (uam.end_time >= o.created_at or uam.end_time is null)
;

edit: La Solution

@KandadaBoggu posté une excellente solution. Le Vestale Versions du plugin est un excellente solution.

extrait de code ci-dessous prise de http://github.com/laserlemon/vestal_versions

Enfin, SÈCHE ActiveRecord gestion des versions!

acts_as_versioned par technoweenie était un bon début, mais il a omis de conserver avec ActiveRecord de l'introduction de la sale des objets dans la version 2.1. En outre, chaque versionnées modèle a besoin de ses propres versions de table qui duplique le plus de l'original colonnes de la table. Les versions de table est ensuite rempli avec les enregistrements qui souvent reproduire la plupart de l'enregistrement d'origine attributs. Dans l'ensemble, pas très SÈCHE.

vestal_versions ne nécessite qu'une des versions de la table (polymorphically associé avec ses parents modèles) et aucun changement que ce soit à des tables existantes. Mais il fait un pas de sèche-linge en stockant une sérialisé de hachage de seulement modèles de changements. Pensez modernes systèmes de contrôle de version. En parcourant le dossier des changements, les modèles peuvent être ramenés à un point quelconque dans le temps.

Et c'est exactement ce que vestal_versions. Pas seulement un modèle d'être revenu à un précédent numéro de version, mais aussi pour une date ou une heure!

source d'informationauteur maček