我期待着尝试使用acts_as_paranoid插件软删除记录。我之前在db中使用了一个标志来管理它。我知道这个插件将从搜索中省略一条记录,并查找该记录是否被软删除。我想知道的是,我是否像validates_uniqueness_of :email
一样在模型中进行了验证,并且我删除(软删除)了电子邮件为‘validates_uniqueness_of :email
@gmail.com’的记录。现在,当我尝试创建具有相同电子邮件的新用户时,验证是否会起作用,并阻止创建新记录。或者,它会像查找一样忽略软删除的记录吗?(当然,我希望这样做。)
发布于 2011-03-08 20:44:27
acts_as_paranoid
不会重新实现validates_uniqueness_of
,因此如果您已经(软)删除了带有电子邮件'prince@gmail.com‘的记录,则无法使用相同的电子邮件创建新记录。
解决这个问题的简单方法是向validates_uniqueness_of添加一个作用域:
validates_uniqueness_of :email, :scope => :deleted_at
这样,您可以使用电子邮件'prince@gmail.com‘删除任意数量的(软)记录,同时仍然使用相同的电子邮件创建新记录。
发布于 2011-02-20 03:52:53
从我们的测试中,acts_as_paranoid
的修补确实会影响删除,因此您将最终得到两条记录。从网络上的大多数对话来看,这可能是你所期望的。
在我们的例子中,我们不希望这样。当我们使用相同的电子邮件创建另一个用户时,我们想要“取消删除”第一个用户,我们希望验证能够帮助我们做到这一点。事实证明,我们无法找到一种方法来做我们想做的事情。在这种情况下,我们最终没有使用acts_as_paranoid
,但我们仍然在考虑返回。
我们确实找到了一个补丁,它允许将标志传递给验证(:with_deleted => true
),这样您就可以显式地控制这一点。这似乎是一个好主意,但我们决定不去追求它。不幸的是,这个问题突出了这种方法有点“泄漏抽象”,必须小心使用。
发布于 2012-11-21 04:55:36
如果您正在使用"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
https://stackoverflow.com/questions/4957845
复制相似问题