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