在模型的多个字段上放置唯一约束

时间:2013-09-17 15:32:00

标签: ruby-on-rails ruby postgresql

我正在开发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类级别中执行此操作?

2 个答案:

答案 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