Rails如何防止以前的记录实例被更新?

时间:2018-02-16 14:54:41

标签: ruby-on-rails associations

我的问题可能有点令人困惑,但我会尽力解释。基本上,我有一些记录需要在创建后保留,并且需要在用户访问和更新记录时保留其先前的信息。我不知道这样做的正确方法,但我考虑了一些方法。

我有两个关联的表:

class Invoice < ApplicationRecord
  belongs_to :customer
end

class Customer < ApplicationRecord
    has_many :invoices, :dependent => :destroy
end

因此,如果用户要更新客户的信息,我需要弄清楚如何保留发票数据(客户数据)。 (在现实生活中,如果客户的电子邮件发生变化,显然不会改变现有的发票)一旦创建发票,基本上不允许更改发票,但是他们有一个与每个发票相关联的客户信息,我需要以某种方式保留旧的信息每张发票。

基本上,我现在正在做的就是禁用所有字段,以便用户无法编辑客户信息(我也将模型更改为attr_readonly并传入所有字段),这些信息有效,但限制为客户信息无法永久更改。

有没有办法获得我追求的功能?如果是这样,理想情况下,客户信息将是可编辑的,但对于与该客户关联的先前创建的发票记录不会更改。

我的做法离我很远吗?我应该重新考虑我的协会吗?或者客户和发票信息都不可编辑,如果客户的信息发生变化,用户只会创建新记录? (想想一个总承包商,例如园艺师为客户做工作并创建发票。如果客户的电话号码发生变化,您可以在您的应用中编辑他们的号码,但不应该更改您之前为该客户创建的所有发票客户信息或多或少只是用于引用,客户可以被标记为重复发生,因此客户信息可能会发生变化,这会产生我想要解决的问题。

1 个答案:

答案 0 :(得分:0)

可能的方法是在创建发票时保存在发票表中显示发票所需的所有数据。客户可以更改其数据,但发票将保持不变。

您还可以考虑在单独的模型中提取一些数据。例如EmailAddressAddress。然后,客户可以创建新的电子邮件地址或地址,但旧数据仍然存在。但是,这种方法只能在某种程度上起作用。它可能导致一些人工创建的模型具有尴尬的名称。这也是一个更复杂的解决方案,因为您必须记住哪些模型是只读的,哪些模型可以自由更新。

出于这个原因,我认为将所有与发票相关的内容保存在单个表中是一种更好且更具错误的解决方案,即使存在一些冗余。