【问题标题】:How to validate unique pairs while being case insensitive如何在不区分大小写的情况下验证唯一对
【发布时间】:2014-12-22 16:34:01
【问题描述】:

我有一个具有“名称”和“领域”属性的公会模型 我想让“名称”和“领域”配对无论大小写都是唯一的。强制区分大小写是我目前唯一遇到的问题。

这是我目前得到的:

validates_uniqueness_of :name, scope: :realm, case_sensitive: false

[case_sensitive: false] 部分有效,但仅适用于第一个属性(名称)

我目前使用 Rails 4.1.8,SQLite 用于开发,PG 用于生产 我真的很感激任何帮助。谢谢!

【问题讨论】:

    标签: ruby-on-rails validation unique case-insensitive


    【解决方案1】:

    据我了解,这不受支持。 case_sensitive 选项适用于正在验证的列,而范围选项仅适用于同一表中的列。

    您可以尝试使用 PG 的 lower 像这样 scope: "lower(realm)" 但我怀疑它在尝试访问 table_name.lower(realm) 列时会失败

    您需要做的是用自定义的验证器替换该验证器。

    class Model
      validate :your_validator
    
      private
    
      def your_validator
        if Model.
           where("LOWER(name) = ? AND LOWER(realm) = ?",
                 name.downcase, realm.downcase).
           exists?
          # add errors here
        end
      end
    end
    

    【讨论】:

    • 这可能是最直接的方法。我只想补充一点,作者应该重新评估是否真的需要让具有不同大小写的realms 彼此相等,而不是在保存之前使它们一致(例如,在保存前进行小写操作或大写领域值)。在后一种情况下,您的原始代码可以工作。
    • 我想包括那个建议。但是阅读Guildsrealm 让我觉得这可能是一个与游戏相关的项目。在游戏中,用户经常使用他们想要保留的奇怪的大写。
    • 是的,那样的话我肯定会采用你的方法(我赞成)。
    • 谢谢大家,我一定会试试这个
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 2012-12-09
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多