【问题标题】:Rails - Custom validation of uniquenessRails - 唯一性的自定义验证
【发布时间】:2016-09-26 10:21:32
【问题描述】:

我想在列(类型字符串)上赋予唯一性,但是问题出在一些字符串上,我在使用函数和before_save 将它们插入数据库之前截断了开头的一部分。因此,rails 唯一性验证不起作用,因为输入可能与数据库中的不同,即使在截断/格式化之后,它们应该是相同的。

我希望能够先截断我的字符串,然后验证它的唯一性,但是我不确定是否可以使用 rails validates uniqueness: true。我只需要编写一个自定义validate 吗?

【问题讨论】:

    标签: ruby-on-rails validates-uniqueness-of


    【解决方案1】:

    Rails 回调的顺序是:

    (-) 保存

    (-) 有效

    (1) before_validation

    (-) 验证

    (2) after_validation

    (3) before_save

    (4) before_create

    (-) 创建

    (5) after_create

    (6) after_save

    (7) after_commit

    详情是here。因此,您只需执行以下操作:

    validates :your_data_field, uniqueness: true
    before_validation :normalize_data
    
    def normalize_data
      # Normalize your data here
    end
    

    因此它将完全按照您的描述工作,并且不需要编写和自定义验证。会更漂亮!

    【讨论】:

      【解决方案2】:

      正如您所提到的,您需要创建一个自定义验证器并使用 validates_with。相关信息在这里:

      http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_with

      为了遵循 DRY 原则,并确保对截断逻辑的任何更改都反映在验证器和 before_save 回调中,我建议创建一个返回截断字符串的方法,并在验证器和回调。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        相关资源
        最近更新 更多