【问题标题】:How to take a snapshot of associated data while creating a record in rails?如何在 Rails 中创建记录时拍摄关联数据的快照?
【发布时间】:2025-12-16 16:45:01
【问题描述】:

在我的 rails 应用程序中,数据库结构是这样的,即有一些主表,并且有一些表的数据基于这些主表(通过关联)。例如,让我们考虑三个主表项目、品牌、uoms(计量单位)。这三个表中的每一个都有一个名为“名称”的属性以及其他属性。现在我们有另一个表,称为采购。要创建购买,我需要选择一个项目、一个品牌和一个单位。但这里的问题是,如果有人更改了商品的名称或任何其他相关数据,购买表中的记录就会更改。

我的问题是处理这种情况的可能方法是什么。一种简单的解决方案是防止编辑主数据。但我也想知道是否可以在购买时有效地复制相关数据。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 ruby-on-rails-6


    【解决方案1】:

    Rails Active Record callbacks。回调允许您编写将在指定操作上运行的方法。

    例如,请参阅此示例代码,该示例代码取自 Rails 文档,其中开发人员在运行 Rails 模型验证之前和之后修改数据。

    class User < ApplicationRecord
      before_validation :normalize_name, on: :create
     
      # :on takes an array as well
      after_validation :set_location, on: [ :create, :update ]
     
      private
        def normalize_name
          self.name = name.downcase.titleize
        end
     
        def set_location
          self.location = LocationService.query(self)
        end
    end
    

    【讨论】: