2017-09-27 64 views
0

我正在嘗試構建一個玩具應用程序,並且遇到了一個我似乎無法解決的問題。我如何強制一對值在表中是唯一的?Rails複合鍵在這對值上執行唯一性

假設以下模式:

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 

,我想創造的部分表與course_id配對的professor_id必須是唯一的唯一性約束。我在挖掘中唯一發現的是,您可以在模型中使用validates關鍵字來強制實現單個字段的唯一性......我還看到有一個validates_with關鍵字,但我找不到任何編寫驗證器的方法做我正在尋找的東西。任何幫助將不勝感激。

回答

2

添加唯一約束,在數據庫(雙關語在遷移):

add_index :sections, [:professor_id, :course_id], unique: true 

現在還放了驗證約束在Section型號:

validates_uniqueness_of :professor_id, scope: :course_id 

現在你professor_id將被唯一驗證在course_id的範圍內。你的數據庫表中也會有一個唯一的限制。