Rails 3验证唯一性忽略模型上的默认范围

Jim*_*mmy 10 activerecord ruby-on-rails-3

我在我的rails 3.0.10应用程序中使用了permanent_records gem,以防止硬删除,而且似乎rails在检查唯一性时忽略了我的默认范围

# user.rb
class User < AR::Base
  default_scope where(:deleted_at => nil)

  validates_uniqueness_of :email # done by devise
end
Run Code Online (Sandbox Code Playgroud)

在我的rails控制台中尝试通过电子邮件找到已删除的用户,结果为null,但在注册具有已删除电子邮件地址的新帐户时,会在电子邮件字段中导致验证错误.

我的应用程序中的另一个模型也是如此

# group.rb
class Group < AR::Base
  default_scope where(:deleted_at => nil)
  validates_uniqueness_of :class_name
end
Run Code Online (Sandbox Code Playgroud)

并且这与以前的情况相同,删除组然后尝试按类名查找它会导致nil,但是当我尝试创建具有已知已删除类名的组时,它将无法通过验证.

有谁知道我做错了什么或者我应该为这种行为编写自定义验证器?

dex*_*ter 10

尝试使用deleted_at确定唯一性检查范围

validates_uniqueness_of : email, :scope => :deleted_at
Run Code Online (Sandbox Code Playgroud)

只要deleted_at字段对于两者都不同,这可以允许具有相同电子邮件值的两个记录.只要删除at填充了正确的时间戳,我想这就是permanent_records gem,这应该可行.

  • 好吧,不要忘记在rails 3中不推荐使用"validates_uniqueness_of".请改用"validates:email,:uniqueness => {:scope =>:deleted_at}". (4认同)