按主键以外的ID更新关联

时间:2014-10-09 21:05:26

标签: 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-6789','987-65-4321']})

使用ActiveRecord::UnknownAttributeError: unknown attribute: student_ssns

3 个答案:

答案 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)

应该让它适合你。