2014-06-10 44 views
0

我有一個has_many測試的班學生。測試類有一個student_id,標記,名字。這裏的測試名稱應該是唯一的。該測試是學生的嵌套屬性。所以參數是這樣的:has_many嵌套屬性的唯一性錯誤

:student => {:first_name => "abc", 
      :email => "[email protected]", 
      :tests_attributes => { "0" => {:name => "bgc", :marks => "470"}}} 

我有更新的問題。如果我使用tests_attributes update_attributes,它會拋出驗證錯誤,說明測試的名稱不唯一。我實際上在這裏處理相同的記錄。我如何克服這一點?

+1

您是否在'Test'模型中具有**'**的唯一性驗證?如果是這樣,你必須刪除它才能完成這項工作。 – Pavan

+0

你是否在'學生'的範圍內處理驗證,或者只是在表中必須是唯一的? –

回答

0

沒有看到您的models(& validations),直接診斷您的錯誤將會非常困難。

-

嵌套屬性

我們已經做了這樣的事情,並發現你的嵌套數據傳遞到子模型就好像它是接受一個新的對象(不嵌套)。這意味着,如果你有validates uniqueness爲模型,應該沒關係:

#app/models/test.rb 
Class Test < ActiveRecord::Base 
    belongs_to :student 
    validates :name, uniqueness: true 
end 

我之所以寫這篇文章是因爲有一個名爲inverse_of方法,它基本上可以讓你訪問你的child模式parent模型數據

-

更新

我認爲這個問題很可能在於,其中y我們使用update_attributes。問題在於您試圖同時更新studenttest屬性。

我不知道到底爲什麼,這將是一個問題,但我想測試:

#app/controllers/students_controller.rb 
class StudentsController < ApplicationController 
    def update 
     @student = Student.find params[:id] 
     @student.test.update(name: params[:test_name], marks: params[:marks]) 
    end 
end 

我認爲,如果你能解釋一下你的方法更多一點,這將是更有益的。 I.E你想更新studenttest?如果你正在更新student &增加一個新的test,你是如何更新studet?

0

感謝您的回覆傢伙。我最終自己找到了答案。我的名字確實有唯一性驗證。 我有一種情況,最初我不知道學生,但只有他的細節。所以我將不得不創建這個散列並傳遞它來更新。不試圖在測試中爲相同名稱創建新記錄的技巧是將實際記錄的ID與它一起傳遞。這解決了這個問題