ruby Rails -如何保存现有记录并对副本应用更新?

idv4meu8  于 9个月前  发布在  Ruby
关注(0)|答案(2)|浏览(110)

我有一个跟踪预算的网页,其中包含大量变量,存储在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之外的所有数据复制到一个新记录中?
提前感谢您的任何建议。

wnavrhmk

wnavrhmk1#

  • dup* 方法返回没有id的新对象,它不会更新它。由于copy_budget方法已经是Budget上的示例方法,因此也不需要(你甚至不能,由于params在模型中不可访问)通过id查找预算,而可以只使用当前示例(self)。因此,下面的更改将为您修复copy_budget方法,但您仍然在复制一个已经修改的对象,就在它被保存到数据库之前
def copy_budget
  copy_of_budget = self.dup
  copy_of_budget.save
end

字符串
它会按照你期望的方式工作。然而,您没有将副本链接到当前版本的预算(无法判断Budget id = 1是Budget id = 2的旧版本)。我建议您查看一个gem,如PaperTrail(我相信还有很多其他的,如果那一个不适合你的需要),它已经考虑了很多问题和功能,保持记录的历史改变。

amrnrhlw

amrnrhlw2#

虽然这个问题有点过时,但最近我也遇到了同样的需求。在before_update方法中,您需要复制现有记录。但是,您并没有真正拥有它,因为self包含更新的信息。您需要提取原始记录并复制它。
您正在用新的id保存旧的record。记住原始主记录的id是明智的。因此,您添加一个名为p_id的新列。然后,以下工作:

before_update :archive_record

def archive_record
  prev = Record.find(self.id)
  arch = prev.dup
  arch.p_id = self.id          ## arch.p_id = arch.id works just as well
  arch.save
end

字符串
您的主记录将具有p_id作为nil。您可以为此定义一个匹配范围。主记录将始终是当前的,其id保持固定。每个副本(历史记录/存档记录)将记住其主记录的ID。
这种方法还有其他各种各样的权衡,但这将跟踪应用程序中的所有record版本。

相关问题