我有一个跟踪预算的网页,其中包含大量变量,存储在40多列中。随着时间的推移,这些预算会进行调整,但我需要能够跟踪随时间和年复一年的变化。我尝试向我的模型添加一个私有方法,该方法应该通过**:before_update**回调触发创建现有记录的副本。然而,它不起作用。更新更改了现有记录,原始记录根本不保留。
型号:
class Budget < ActiveRecord::Base
before_update :copy_budget
private
def copy_budget
@budget = Budget.find(params[:id])
@budget.dup
@budget.save
end
end
字符串
我还在学习Rails(这是在Rails 4中),我认为这是最好的方法。如果没有,有没有更好的方法将表单设置为“总是发布新记录”,而不是在记录已经存在时路由更新?
当前的form_for行看起来像这样:
第一个月
一切都像它应该的那样工作,除了复制没有发生。我错过了什么?有没有可能.dup函数也复制了:id?这是通过使用MySQL数据库中的自动递增来分配的,所以如果.dup复制了一切,有没有办法将除了:id之外的所有数据复制到一个新记录中?
提前感谢您的任何建议。
2条答案
按热度按时间wnavrhmk1#
copy_budget
方法已经是Budget
上的示例方法,因此也不需要(你甚至不能,由于params
在模型中不可访问)通过id查找预算,而可以只使用当前示例(self)。因此,下面的更改将为您修复copy_budget
方法,但您仍然在复制一个已经修改的对象,就在它被保存到数据库之前字符串
它会按照你期望的方式工作。然而,您没有将副本链接到当前版本的预算(无法判断Budget id = 1是Budget id = 2的旧版本)。我建议您查看一个gem,如PaperTrail(我相信还有很多其他的,如果那一个不适合你的需要),它已经考虑了很多问题和功能,保持记录的历史改变。
amrnrhlw2#
虽然这个问题有点过时,但最近我也遇到了同样的需求。在
before_update
方法中,您需要复制现有记录。但是,您并没有真正拥有它,因为self
包含更新的信息。您需要提取原始记录并复制它。您正在用新的
id
保存旧的record
。记住原始主记录的id
是明智的。因此,您添加一个名为p_id
的新列。然后,以下工作:字符串
您的主记录将具有
p_id
作为nil
。您可以为此定义一个匹配范围。主记录将始终是当前的,其id
保持固定。每个副本(历史记录/存档记录)将记住其主记录的ID。这种方法还有其他各种各样的权衡,但这将跟踪应用程序中的所有
record
版本。