2014-10-09 81 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) 

應該得到它正常工作適合你。