Ruby on rails 按主键以外的ID更新关联

Ruby on rails 按主键以外的ID更新关联,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,假设我想通过传递主键以外的密钥来更新关联,如社会保险号: 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-

假设我想通过传递主键以外的密钥来更新关联,如社会保险号:

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:未知属性:学生

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

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

如果SSN是学生行的唯一标识符,则可以将其作为主键,而不是默认的整数-但约定建议将“普通”ID字段保留在那里

那么,教师的方法是采用
student\u ssns
而不是
student\u id
,然后在该方法中查找学生id(类似于Kevin Monk的答案)怎么样

然后您可以这样使用它:

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

如果SSN是学生行的唯一标识符,则可以将其作为主键,而不是默认的整数-但约定建议将“普通”ID字段保留在那里

那么,教师的方法是采用
student\u ssns
而不是
student\u id
,然后在该方法中查找学生id(类似于Kevin Monk的答案)怎么样

然后您可以这样使用它:

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

使用Pavling的解决方案,但将定义行更改为:

def student_ssns=(ssns)

使用Pavling的解决方案,但将定义行更改为:

def student_ssns=(ssns)

应该可以让它正常工作。

我喜欢这个解决方案,但失败了:老师。新的({name:'Miss Molly',student_ssns:['123-45-6789','987-65-4321']})使用ActiveRecord::UnknownAttributeError:未知属性:student\u ssnsI调整了方法名。。。抱歉,它应该是一个“setter”,我喜欢这个解决方案,但它失败了:Teacher.new({name:'Miss Molly',student_ssns:['123-45-6789','987-65-4321']})和ActiveRecord::UnknownAttributeError:unknown属性:student_ssnsI已经调整了方法名。。。对不起,它应该是一个“setter”