2

我正在开发一个 ruby​​ on rails 应用程序,我想对数据库表中的多个字段进行约束,即:

|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​​ 课程级别上做这件事?

4

2 回答 2

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
于 2013-09-17T15:34:50.093 回答
2

是的,您可以将其作为数据库约束来执行。在迁移中:

add_index :table_name, [:column_name_a, :column_name_b], unique: true
于 2013-09-17T15:35:57.187 回答