坚持旧的ActiveRecord模型属性

时间:2013-07-13 04:36:46

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord revision-history

我有一个名为Client的模型,有3个属性:名称,电话和电子邮件。 在开始时,我有一个客户端,其中包含一些值: Mark,+ 54261334455和fake@client.com 。然后我将这些值更改为: Peter,+ 52261444444,another@mail.com ,但我需要保留旧值。我怎么能这样做?

我的选择:

  1. 创建old_attr列:姓名,电话,电子邮件,old_name,old_phone和old_email 。我认为这是一个丑陋的解决方案......
  2. 使用serialize仅保留具有额外费用的旧数据:姓名,电话,电子邮件和数据。我认为这不是一个好主意,因为你需要多次操纵旧数据。
  3. 创建2个Client实例。一个具有旧数据,另一个具有新数据,向客户机模型添加额外字段以关联这些对象。我认为这是更好的解决方案,但我需要在两个
  4. 中分配“一个客户端”

    更好的想法来做到这一点?

2 个答案:

答案 0 :(得分:1)

选项4:创建与ClientHistory相同的Client模型,并添加引用相应client_id的{​​{1}}列。然后,Client回调可以执行以下操作:

before_save

当然,before_save :track_history def track_history return if(new_record? || !changed?) old = Hash[attribute_names.map { |name| [name == 'id' ? 'client_id' : name, self.send("#{name}_was")] }] ClientHistory.create!(old) end 可以在new_record? || !changed?电话上推送到:if选项。您可能希望过滤before_save以留下更多的东西,您可能只想跟踪已更改的内容,这些都是非常简单的修改(但要小心您如何跟踪 - {{1来自 - attribute_names过渡)。

答案 1 :(得分:1)

在您的情况下可能会有些过分,但有一些很棒的ActiveRecord版本控制工具。 它可以让您跟踪对特定记录所做的更改,甚至可以将值重置为以前的版本。

我所知道的最佳解决方案之一是paper_trail