我有以下型号:
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
答案 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
或者可以在update
和create
上运行验证,您可以尝试这样做:
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
。