我正在开发rails应用程序上的ruby,我想在数据库表中对多个字段设置约束,即:
|id|field_one|field_two
1 27 Value
2 27 Value
这应该是非法的,因为field_one和field_two的组合不应该重复。以下内容非常好:
|id|field_one|field_two
1 27 Value
2 28 Value
3 27 AnotherValue
我可以在数据库级别进行此约束吗?或者我需要在ruby类级别中执行此操作?
答案 0 :(得分:3)
是的,您可以使用常规验证,唯一性和范围选项来执行此操作:
validates :field_one, uniqueness: { scope: [:field_two] }
如果您需要自己的自定义验证方法,可以执行以下操作:
validates :uniqueness_of_fields
private # optionnal
def uniqueness_of_fields
if self.class.exists?(field_one: self[:field_one], field_two: self[:field_two])
self.errors.add(:field_one, "Combination #{self[:field_one]} and #{self[:field_two]} already existings!"
logger :do_your_thing # here is where you want to log stuff
return false
else
return true # validation passes, is unique
end
end
答案 1 :(得分:2)
是的,您可以将此作为数据库约束。在迁移中:
add_index :table_name, [:column_name_a, :column_name_b], unique: true