我正在尝试使用acts_as_paranoid插件来软删除记录。我之前使用数据库中的标志来管理它。我知道这个插件会从搜索中省略一条记录,并查找该记录是否被软删除。我想知道的是,我是否在像
validates_uniqueness_of :email
这样的模型中进行了验证,并且删除了(软删除)包含电子邮件“[电子邮件受保护]”的记录。现在,当我尝试创建具有相同电子邮件地址的新用户时,验证是否有效并阻止创建新记录。或者它会像查找结果一样省略软删除记录吗? (当然,我希望这样的事情发生。)
根据我们的测试,
acts_as_paranoid
的修补确实会影响删除,因此您最终会得到两条记录。从网络上的大多数对话来看,这可能就是您所期望的。
就我们而言,我们不希望这样。当我们使用相同的电子邮件创建另一个用户时,我们想要“取消删除”第一个用户,并且我们希望验证能够帮助我们完成此操作。事实证明,我们无法找到一种方法来完成我们想要的事情。在这种情况下,我们最终没有使用
acts_as_paranoid
,但我们仍在考虑回去。
我们确实找到了一个补丁,允许将标志传递给验证(
:with_deleted => true
),以便您可以显式控制这一点。这似乎是个好主意,但我们决定不采用它。不幸的是,这个问题凸显了这种方法有点“抽象漏洞”,必须小心使用。
如果您正在使用“rails3_acts_as_paranoid”,那么请针对上述问题做好准备,
ActiveRecord 的内置唯一性验证不考虑 ActsAsParanoid 删除的记录。如果您只想检查未删除记录的唯一性,请在模型中使用宏 validates_as_paranoid。然后,不要使用 validates_uniqueness_of,而是使用 validates_uniqueness_of_without_deleted。这将使已删除的记录不计入唯一性检查。
需要指定以下方式,
acts_as_paranoid
validates_as_paranoid
validates_uniqueness_of_without_deleted :name
使用
with_deleted
范围的简单解决方案
validates :email, uniqueness: { conditions: ->{ with_deleted } }