2012-11-01 45 views
2

的代碼味道,我敢肯定,我缺少一個幫手做一個簡單的 更新或類似下面的代碼片段創建查詢:更好的Rails代碼更新或創建子句?

@user_answer = current_user.user_answers.find_by_question_id(params[:a_question]) 
    if @user_answer.nil? 
    @user_answer = current_user.user_answers.build({ :answer_id => params[:an_answer] , :question_id => params[:a_question] })  
    @user_answer.save 
    else 
    @user_answer.update_attributes(:answer_id => params[:an_answer]) 
    @user_answer.save 
    end 
+0

只是一個小小的建議,你不需要在else塊作爲對的update_attributes呼籲保存方法反正會隱式保存對象。請看我的回答 –

回答

4

你可能會尋找find_or_initialize_by方法。例如:

@user_answer = current_user.user_answers.find_or_initialize_by_question_id(params[:a_question]) 
@user_answer.answer_id = params[:an_answer] 
@user_answer.save 
+0

我們也可以做一個find_or_create_by_question_id,這樣可以避免在這裏保存。 –

+0

@ManjunathManohar我建議'find_or_initialize_by'的原因是海報想要更新'answer_id',而不管'user_answer'是否存在。如果_does_存在,'find_or_create_by'不會實際更新記錄。它會按原樣找到並保留它,所以他仍然需要手動設置'answer_id'並調用'save'或使用'update_attribute(s!)'。首先創建記錄,然後以這種方式更新將需要一個不必要的額外數據庫調用。 – cdesrosiers

+0

是有道理的! –

0

怎麼樣,

@user_answer = current_user.user_answers.find_or_create_by_question_id(params[:a_question]) 

這將避免明確的保存