Rails复合键以强制值对的唯一性

时间:2017-09-27 02:19:46

标签: ruby-on-rails ruby

我正在尝试构建一个玩具应用程序并遇到一个我似乎无法解决的问题。如何强制表中的一对值是唯一的?

假设以下架构:

  create_table "courses", force: :cascade do |t|
    t.string "title"
    t.text "description"
    t.string "number"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "status", default: 0
  end

  create_table "professors", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "status", default: 0
  end

  create_table "sections", force: :cascade do |t|
    t.integer "number"
    t.integer "max_enrollment"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "professor_id"
    t.integer "course_id"
    t.string "room"
    t.index ["course_id"], name: "index_sections_on_course_id"
    t.index ["professor_id"], name: "index_sections_on_professor_id"
  end

我希望在section表中创建唯一性约束,professor_idcourse_id配对必须是唯一的。我在挖掘中发现的唯一一件事是你可以使用模型中的validates关键字来强制执行单个字段的唯一性...我还看到有一个validates_with关键字但我找不到任何方法来编写验证器来做我正在寻找的事情。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

在数据库中添加唯一约束(迁移中的Pun):

if(condition1){

} elseif(condition2){
    $url = "www.google.com";
}else{


}

现在还在您的add_index :sections, [:professor_id, :course_id], unique: true 模型中添加了验证约束:

Section

现在,您的validates_uniqueness_of :professor_id, scope: :course_id 将在professor_id范围内进行唯一验证。此外,数据库表中还有一个唯一约束。