2014-10-09 40 views
1

比方说,我想通过传递键以外的主键,如社会安全号码来更新关联:更新联想比其他主键

Teacher.find(params[:id]).update({'student_ids'=>['123-45-6789','987-65-4321']}) 

我怎样才能让我的老师模型理解它将接收SSN,而不是数据库ID? SSN唯一标识一名学生。

编辑:我喜欢Pavling的解决方案,因为它保留了模型中的逻辑。然而,这失败:

Teacher.new({name:'Miss Molly',student_ssns:['123-45-6789','987-65-4321']}) 

随着ActiveRecord::UnknownAttributeError: unknown attribute: student_ssns

回答

1

如果SSN是你的学生行的唯一标识,你可以使它的主键,而不是的默认整数 - 但约定会建议离开'正常'ID字段。

那么如何在老师上采用student_ssns而不是student_ids,并在该方法中找到学生id(类似于Kevin Monk的答案)?

# teacher.rb 
def student_ssns=(ssns) 
    student_ids = Student.where(ssn: ssns).pluck(:id) 
    update({student_ids: student_ids}) 
end 

然后你可以这样使用它:

Teacher.find(params[:id]).student_ssns(['123-45-6789','987.65.4321']) 
+0

我喜欢这个解决方案,但此操作失败: Teacher.new({名称:'莫利小姐,student_ssns:[ '123-45-6789', '987-65-4321']}) 随着ActiveRecord :: UnknownAttributeError:未知属性:student_ssns – Dave 2014-10-10 16:13:45

+0

我调整了方法名称...对不起,它应该是一个'setter' – Pavling 2014-10-10 20:30:13

2

......怎么

student_ids = Student.where(ssn:['123-45-6789','987.65.4321']).map(&:id) 
Teacher.find(params[:id]).update({'student_ids'=> student_ids}) 
1

使用Pavling的解决方案,但改变的定义行:

def student_ssns=(ssns) 

应该得到它正常工作适合你。