我正在尝试使用acts_as_paranoid插件进行软删除记录。我之前使用db中的标志来管理它。我知道这个插件将省略搜索记录并查找记录是否被软删除。我想知道的是,如果我在模型中进行验证,例如validates_uniqueness_of :email
,我删除了(软删除)带有电子邮件'prince@gmail.com'的记录。现在,当我尝试创建具有相同电子邮件的新用户时,验证将起作用并阻止创建新记录。或者它会忽略软删除的记录,就像它对发现一样吗? (当然,我希望这种情况发生。)
答案 0 :(得分:13)
acts_as_paranoid
未重新实现validates_uniqueness_of
,因此如果您(软)删除了包含电子邮件'prince@gmail.com'的记录,则无法使用相同的电子邮件创建新记录。
对此的简单修复是将范围添加到validates_uniqueness_of:
validates_uniqueness_of :email, :scope => :deleted_at
通过这种方式,您可以使用电子邮件“prince@gmail.com”获得任意数量的(软)删除记录,并使用相同的电子邮件创建新记录。
答案 1 :(得分:2)
从我们的测试中,acts_as_paranoid
确实会影响删除的修补,因此最终会有两条记录。从大多数网络对话中,这可能就是您所期望的。
在我们的案例中,我们不希望这样。当我们使用相同的电子邮件创建另一个用户时,我们希望“取消删除”第一个用户,我们希望验证能够解决这个问题。事实证明,我们无法找到一种方法来做我们想要的。在这种情况下,我们最终没有使用acts_as_paranoid
,但我们仍在考虑回去。
我们确实找到了一个允许将标志传递给验证(:with_deleted => true
)的补丁,以便您可以明确地控制它。这似乎是一个好主意,但我们决定不追求它。不幸的是,这个问题突出表明这种方法有点“漏洞”,必须谨慎使用。
答案 2 :(得分:0)
如果您正在使用“rails3_acts_as_paranoid”,则可以提供上述问题,
ActiveRecord的内置唯一性验证不考虑ActsAsParanoid删除的记录。如果要仅检查未删除记录中的唯一性,请在模型中使用宏validates_as_paranoid。然后,使用validates_uniqueness_of_without_deleted,而不是使用validates_uniqueness_of。这将使删除的记录不计入唯一性检查。
需要指定以下方式,
acts_as_paranoid
validates_as_paranoid
validates_uniqueness_of_without_deleted :name