has_many嵌套属性中的唯一性错误

时间:2014-06-10 05:50:34

标签: ruby-on-rails ruby

我有一名班级学生参加了has_many考试。测试类有一个student_id,标记,名称。这里的测试名称应该是唯一的。该测试是学生的嵌套属性。所以参数是这样的:

:student => {:first_name => "abc", 
             :email => "dfsdf@sfdsdsd.bbb", 
             :tests_attributes => { "0" => {:name => "bgc", :marks => "470"}}}

我遇到更新问题。如果我使用tests_attributes更新update_attributes,则会抛出一个验证错误,指出test的名称不是唯一的。我实际上是在这里写同一个记录。我该如何克服这个问题?

3 个答案:

答案 0 :(得分:0)

如果没有看到您的models(& validations),就很难直接诊断出错误。

-

嵌套属性

我们已经做了类似的事情,发现你的嵌套数据被传递给子模型,好像它正在接收一个新对象(没有嵌套)。这意味着如果您为该模型获得validates uniqueness,那么它应该没问题:

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

我写这个的原因是因为有一个名为inverse_of的方法,它基本上允许您访问parent模型中的child模型数据

-

<强>更新

我认为问题可能在于您使用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您是要更新student还是test?如果您要更新student&amp;添加新的test,您如何更新studet?

答案 1 :(得分:0)

感谢回复人员。我自己最终找到了答案。我确实对名称进行了唯一性验证。 我有一种情况,最初我不会认识学生但只有他的细节。所以我必须创建这个哈希并将其传递给更新。不尝试在测试中为同一名称创建新记录的技巧是传递实际记录的ID。这解决了问题

答案 2 :(得分:0)

嵌套属性

我认为nested_attributes存在问题。要进行更新,需要传递带有ID的nested_attributes。 例如

:student => {:first_name => "abc", 
             :email => "dfsdf@sfdsdsd.bbb", 
             :tests_attributes => { "0" => {id: 1, :name => "bgc", :marks => "470"}}}

我尝试了下面给出的示例,它对我有用:

更新

 #app/controllers/students_controller.rb
    class StudentsController < ApplicationController
        def update
            @student = Student.find params[:id]
            @student.update_attributes(student_params)
        end

        private

        def student_params
          params.require(:student).permit(:first_name, :email, 
          tests_attributes: [:id, :name, :marks])
        end
    end