【问题标题】:Rails 3 validate uniqueness ignores default scope on modelRails 3 验证唯一性忽略模型上的默认范围
【发布时间】:2011-08-27 04:09:15
【问题描述】:

我在我的 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

在我的 Rails 控制台中,尝试通过已删除的电子邮件查找用户会导致 null,但是当使用已删除的电子邮件地址注册新帐户时,会导致电子邮件字段出现验证错误。

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

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

这与以前的情况相同,删除一个组然后尝试通过类名查找它会导致 nil,但是当我尝试使用已知的已删除类名创建一个组时,它会失败验证。

有谁知道我做错了什么,还是应该为此行为编写自定义验证器?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

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

    validates_uniqueness_of : email, :scope => :deleted_at
    

    这可以允许两个记录具有相同的电子邮件值,只要两个记录的 deleted_at 字段不同。只要用正确的时间戳填充了 deleted at ,我猜permanent_records gem就是这样做的,这应该可以工作。

    【讨论】:

    • 好吧,只是不要忘记 "validates_uniqueness_of" 在 rails 3 中已弃用。请改用 "validates :email, :uniqueness => {:scope => :deleted_at}"。
    • 它不会调用同一个验证器吗...?
    • 我会把它标记为正确的,因为它会很好,幸运的是昨晚我没有仔细考虑,我编写了我自己的作用域唯一性验证器,它运行良好
    • 我不认为validates_uniqueness_of 已被弃用。新方法只是分组验证的另一种方法。
    猜你喜欢
    • 2023-03-07
    • 2011-08-16
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多