系统中我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
答案 0 :(得分:1)
如果您的TimeRecord需要该名称,无论用户是否仍然存在,那么我建议将user_name存储在TimeRecord以及用户上,而不是委托给他。
当用户名称发生变化时,我会相应地更新相关的TimeRecords。
答案 1 :(得分:1)
最好假装删除软删除的记录以保持参照完整性。既然你已经说TimeRecord
保留了一个&#34;快照&#34;当时的用户,解决方案应该是明确的:将name
添加到TimeRecord
中存储的字段作为快照。
即使不允许用户更改其名称,这也是这种去规范化的完美用例。
答案 2 :(得分:1)
如果要包含关联的软删除对象,可以简单地取消关联,如下所示:
udev