2

我有一个名为 Client 的模型,它具有 3 个属性:姓名、电话和电子邮件。 在开始时,我有一个带有一些值的 Client 实例:Mark、+54261334455 和 fake@client.com。然后我将这些值更改为:Peter,+54261444444,another@mail.com,但我需要保留旧值。我怎样才能做到这一点?

我的选择:

  1. 创建 old_attr 列:name、phone、email、old_name、old_phone 和 old_email。我认为这是一个丑陋的解决方案......
  2. 使用serialize保留仅具有额外字段的旧数据:姓名、电话、电子邮件和数据。我认为这不是一个好主意,因为您需要多次操作旧数据。
  3. 创建 2 个客户端实例。一个带有旧数据,另一个带有新数据,向客户端模型添加了一个额外的字段来关联这些对象。我认为这是更好的解决方案,但由于将“一个客户”一分为二,我需要增加很多逻辑

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

4

2 回答 2

1

Option 4: Create a ClientHistory model that is identical to Client with the addition of a client_id column that references the appropriate Client. Then, a before_save callback could do something like this:

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

The new_record? || !changed? could be pushed to an :if option on the before_save call of course. You might want to filter the attribute_names to leave more things out of course and you might want to only track things that have changed, both of these are pretty trivial modifications (but be careful about how you track to-nil and from-nil transitions).

于 2013-07-13T04:56:32.350 回答
1

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

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

于 2013-07-13T05:16:46.627 回答