我正在尝试构建一个玩具应用程序并遇到一个我似乎无法解决的问题。如何强制表中的一对值是唯一的?
假设以下架构:
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_id
与course_id
配对必须是唯一的。我在挖掘中发现的唯一一件事是你可以使用模型中的validates
关键字来强制执行单个字段的唯一性...我还看到有一个validates_with
关键字但我找不到任何方法来编写验证器来做我正在寻找的事情。任何帮助将不胜感激。
答案 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
范围内进行唯一验证。此外,数据库表中还有一个唯一约束。