2013-05-21 42 views
0

我是ruby的新手,我想確保模型中三列的組合是唯一的。我嘗試使用validates_uniqueness_of與範圍,但它沒有按預期工作。所以我給我的數據庫添加了一個唯一的索引,每次保存已經存在的值組合時,都會引發ActiveRecord :: RecordNotUnique異常。問題是我不確定如何處理異常。在我的控制器中我改變了更新動作:在Rails 3.2中拯救ActiveRecord :: RecordNotUnique

def update 

    @patient_history = PatientHistory.find(params[:id]) 
    @patient_history.save! 

    respond_to do |format| 
    format.html { redirect_to @patient_history, notice: 'Patient history was successfully updated.' } 
    format.json { head :no_content } 
    end 

rescue ActiveRecord::RecordNotUnique 

    respond_to do |format| 
    format.html { render action: "edit" } 
    format.json { render json: @patient_history.errors, status: :unprocessable_entity } 

    end 
end 
end 

此代碼不會保存更改並重定向到我的模型的顯示頁面(:patient_history)與通知「患者的病史已成功更新」。我想要做的是讓控制器重定向到編輯頁面,並在頁面頂部閃爍一條關於錯誤的消息(就像validates_uniqueness會做的那樣)。

在此先感謝

回答

1

你是如何嘗試使用validates_uniqueness_of?你應該用這個來確保這個組合是獨一無二的,像這樣:

validates_uniqueness_of :column1, :scope => [:column2, :column3] 
+0

是的,這就是我所做的,但它並不總是正常工作。所以這就是我添加索引的原因。 – Michael

+0

@Marek Rails驗證方法不會阻止競爭條件,在SQL中創建「硬件」索引總是一個好主意。只是因爲它不經常發生,我通常更喜歡「讓它失敗」的範例,但這取決於你的客戶。 –

+0

我想使它發生錯誤時,將用戶重定向到表單頁面,並可能會打印出一個錯誤信息。但是無論我在控制器中嘗試過,它都不起作用。 – Michael

相關問題