我想说我想通过传入除主键以外的密钥来更新关联,例如社会安全号码:
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
答案 0 :(得分:2)
怎么样......
student_ids = Student.where(ssn:['123-45-6789','987.65.4321']).map(&:id)
Teacher.find(params[:id]).update({'student_ids'=> student_ids})
答案 1 :(得分: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'])
答案 2 :(得分:1)
使用Pavling的解决方案,但将定义行更改为:
def student_ssns=(ssns)
应该让它适合你。