Rails模型验证,检查是否已存在具有某些属性的对象

时间:2016-07-26 09:29:39

标签: ruby-on-rails validation model

我有以下型号:

class TestModel < ActiveRecord::Base
  enum some_column: [:prop1, :prop2, :prop3]
end

我想确保在数据库中我总是拥有最多一个具有prop1列值的对象,而我可以拥有多个具有prop2或prop3对象的对象,或者没有任何对象。如果可以进行模型验证,那就太好了。我尝试过这种方式,但不确定这是否适用于rails应用程序:

      if ((id.nil? and TestModel.where(some_column: 'prop1')) or (TestModel.where(some_column: 'prop1').where.not(id: id)))

我尝试用左侧覆盖创建动作,右侧覆盖更新。有没有轨道方法可以做到这一点?

由于

已更新

这是我的问题的解决方案

def only_one_prop1_record
  if(some_column == 'prop1')
    if new_record? #if create action
      if TestModel.where(some_column: 'prop1').any?
        errors.add(:base, 'You can only have one prop1 record')
      end
    elsif persisted? #if update action
      if TestModel.where(some_column: 'prop1').where.not(id: id).any?
        errors.add(:base, 'You can only have one prop1 record')
      end
    end
  end
end

并按照以下方式调用验证:validate :only_one_prop1_record

1 个答案:

答案 0 :(得分:2)

这可能会对您有所帮助:

class TestModel < ActiveRecord::Base
  enum some_column: [:prop1, :prop2, :prop3]

  validate :only_one_prop1_record, on: :create

  def only_one_prop1_record
    if TestModel.exists?(some_column: prop1)
      errors.add(:base, 'You can only have one prop1 record')
    end
  end
end

或者可以在updatecreate上运行验证,您可以尝试这样做:

def only_one_prop1_record
  existing_record = TestModel.where(some_column: prop1).first
  if (new_record? && existing_record.present?) || (persisted? && existing_record != self)
    errors.add(:base, 'You can only have one prop1 record')
  end
end

从上方删除on: :create