0

Users在系统中可以使用 soft_deleted 来paranoia (2.0.2)跟踪TimeRecords有多少人:hoursuser给定的任务中工作,以及他们:cost在整个任务中的总数是多少(:cost = :rate * :hours为了简单起见)。

这些记录会持续存在,因此即使user将来更改 a 的费率,您仍然可以准确了解他们过去为给定任务收取的费用。输入软删除。Auser可以使用软删除(设置deleted_at: Time.now)从系统中删除,但我需要他们的名字仍然显示链接到:hours他们:cost过去收费。我有一个可行的解决方案,但对我来说感觉太老套了,而且我找不到更优雅的解决方案。我很感激任何建议/帮助人们可能必须以正确的方式而不是简单的方式来做到这一点。

当前解决方案:

class TimeRecord < ActiveRecord::Base
  belongs_to :user

  delegate :name, to: :user, prefix: true, allow_nil: true

  def name
    user_name || "#{User.with_deleted.find(user_id).name}" rescue 'n/a'
  end
end
4

3 回答 3

1

如果您的 TimeRecord 需要名称,无论 User 是否仍然存在,那么我建议将 user_name 存储在 TimeRecord 和 User 上,而不是委托它。

当用户的名称发生变化时,我会相应地更新相关的 TimeRecords。

于 2016-02-26T15:44:32.880 回答
1

最好假装软删除记录被真正删除以保持参照完整性。TimeRecord由于您当时已经说过 a保留了用户的“快照”,因此解决方案应该很清楚:添加name到您TimeRecord作为快照存储的字段中。

即使不允许用户更改其名称,这也是这种非规范化的完美用例。

于 2016-02-26T15:45:46.890 回答
1

如果您想包含关联的软删除对象,您可以像这样简单地取消关联范围:

class TimeRecord < ActiveRecord::Base
  belongs_to :user, -> { with_deleted } # associate soft-deleted user
  delegate :name, to: :user, prefix: true, allow_nil: true
end
于 2016-02-26T16:14:14.943 回答