使用acts_as_paranoid插件进行软删除 - 验证怎么样?

问题描述 投票:0回答:4

我正在尝试使用acts_as_paranoid插件来软删除记录。我之前使用数据库中的标志来管理它。我知道这个插件会从搜索中省略一条记录,并查找该记录是否被软删除。我想知道的是,我是否在像

validates_uniqueness_of :email
这样的模型中进行了验证,并且删除了(软删除)包含电子邮件“[电子邮件受保护]”的记录。现在,当我尝试创建具有相同电子邮件地址的新用户时,验证是否有效并阻止创建新记录。或者它会像查找结果一样省略软删除记录吗? (当然,我希望这样的事情发生。)

ruby-on-rails
4个回答
15
投票

acts_as_paranoid
不会重新实现
validates_uniqueness_of
,因此,如果您(软)删除了电子邮件地址为“[电子邮件受保护]”的记录,则无法使用同一电子邮件地址创建新记录。

解决此问题的简单方法是向 validates_uniqueness_of 添加范围:

validates_uniqueness_of :email, :scope => :deleted_at

这样,您可以拥有任意数量的(软)删除的电子邮件地址为“[电子邮件受保护]”的记录,并且仍然可以使用同一电子邮件地址创建新记录。


3
投票

根据我们的测试,

acts_as_paranoid
的修补确实会影响删除,因此您最终会得到两条记录。从网络上的大多数对话来看,这可能就是您所期望的。

就我们而言,我们不希望这样。当我们使用相同的电子邮件创建另一个用户时,我们想要“取消删除”第一个用户,并且我们希望验证能够帮助我们完成此操作。事实证明,我们无法找到一种方法来完成我们想要的事情。在这种情况下,我们最终没有使用

acts_as_paranoid
,但我们仍在考虑回去。

我们确实找到了一个补丁,允许将标志传递给验证(

:with_deleted => true
),以便您可以显式控制这一点。这似乎是个好主意,但我们决定不采用它。不幸的是,这个问题凸显了这种方法有点“抽象漏洞”,必须小心使用。


0
投票

如果您正在使用“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

0
投票

使用

with_deleted

范围的简单解决方案
validates :email, uniqueness: { conditions: ->{ with_deleted } }
© www.soinside.com 2019 - 2024. All rights reserved.