我有一名班级学生参加了has_many考试。测试类有一个student_id,标记,名称。这里的测试名称应该是唯一的。该测试是学生的嵌套属性。所以参数是这样的:
:student => {:first_name => "abc",
:email => "dfsdf@sfdsdsd.bbb",
:tests_attributes => { "0" => {:name => "bgc", :marks => "470"}}}
我遇到更新问题。如果我使用tests_attributes更新update_attributes,则会抛出一个验证错误,指出test的名称不是唯一的。我实际上是在这里写同一个记录。我该如何克服这个问题?
答案 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
。您在尝试同时更新student
和test
属性时遇到问题。
我不确定为什么会出现这个问题,但我会对此进行测试:
#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