【发布时间】:2011-01-20 09:04:43
【问题描述】:
梦想
我想记录用户何时更改地址。
这样,下订单时,它始终能够引用下订单时使用的用户地址。
可能的架构
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
)
在 sql 中,这可能类似于:[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)
;
编辑:解决方案
@KandadaBoggu 发布了一个很好的解决方案。 Vestal Versions plugin 是一个出色的解决方案。
下面的sn-p取自http://github.com/laserlemon/vestal_versions
最后,DRY ActiveRecord 版本控制!
technoweenie 的acts_as_versioned 是一个很好的开始,但它未能跟上 ActiveRecord 在 2.1 版本中引入脏对象的速度。此外,每个版本化模型都需要自己的版本表,该表复制了原始表的大部分列。然后,版本表中会填充通常与原始记录的大部分属性重复的记录。总而言之,不是很干燥。
vestal_versions 只需要一个版本表(与其父模型多态关联)并且对现有表没有任何更改。但它通过存储仅模型更改的序列化散列来实现 DRYer。想想现代版本控制系统。通过遍历变化的记录,模型可以恢复到任意时间点。
这正是 vestal_versions 所做的。 模型不仅可以恢复到以前的版本号,还可以恢复到日期或时间!
【问题讨论】:
-
PaperTrail 也能做到这一切。
-
请不要在问题中编辑解决方案公告。改为自己创建一个答案或接受现有答案之一。
标签: ruby-on-rails activerecord schema