【问题标题】:Verify uniqueness of single value across multiple columns验证跨多个列的单个值的唯一性
【发布时间】:2016-06-16 19:03:23
【问题描述】:

我有一个 ActiveRecord 对象,它有四个 String 列。我想进行验证,以验证某个值在所有四列中是唯一的。例如,假设有问题的四列命名为abcd

FooObject.new( a: 'bar' ).save!

应该会成功,但是

FooObject.new( b: 'bar' ).save!

应该会失败,因为已经有一个 FooObject 其值 abcd 与为 b 输入的值匹配。是否有一种简洁、干净的方式来完成对对象的验证?谢谢!

【问题讨论】:

  • @potashin 我正在尝试做的事情略有不同 - 该示例表明列的组合不应该是唯一的。我正在尝试做的是确保任何两行的上述列的 any 中不会同时存在一个值。这有意义吗?

标签: ruby-on-rails validation activerecord rails-activerecord


【解决方案1】:
arr = ["a", "b"]
arr.uniq{|x| x}.size //2
arr << "b"
arr.uniq{|x| x}.size // 2

2 == 2

因此该元素已存在于列中

arr 代表FoObject 一行的临时副本

【讨论】:

    【解决方案2】:

    您可以尝试自定义方法:

    validate :uniqueness_across_columns
    
    def uniqueness_across_columns
      cols = [:a, :b, :c, :d]
      conditions = cols.flat_map{|x| cols.map{|i| arel_table[x].eq(self.try(i)) if self.try(i).present? }}
    
      !self.class.exists? conditions.compact.reduce(:or)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2011-03-17
      • 2015-12-07
      • 2014-08-25
      相关资源
      最近更新 更多