需要返回:对象的名称,即使它被软删除(使用偏执狂)

时间:2016-02-26 15:24:24

标签: ruby-on-rails ruby-on-rails-4 soft-delete ruby-paranoia

系统中我Users可以使用paranoia (2.0.2)TimeRecords进行soft_deleted,跟踪:hours user对给定的:cost工作的数量分配以及整个作业的总:cost = :rate * :hours的内容(user以保持简单)。

这些记录仍然存在,即使将来user的费率发生变化,您仍然可以准确了解他们过去为特定任务收取的费用。 输入软删除。可以使用软删除(设置deleted_at: Time.now)从系统中删除:hours,但我需要将其名称显示为与{{ 1}}和: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

3 个答案:

答案 0 :(得分:1)

如果您的TimeRecord需要该名称,无论用户是否仍然存在,那么我建议将user_name存储在TimeRecord以及用户上,而不是委托给他。

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

答案 1 :(得分:1)

最好假装删除软删除的记录以保持参照完整性。既然你已经说TimeRecord保留了一个&#34;快照&#34;当时的用户,解决方案应该是明确的:将name添加到TimeRecord中存储的字段作为快照。

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

答案 2 :(得分:1)

如果要包含关联的软删除对象,可以简单地取消关联,如下所示:

udev