2017-01-30 103 views
0

我有一個研究所和一個位置表。我從提取電子表格中的數據,目前有如下信息:從欄表參考中獲取外鍵

Institute 

id, name, ukprn 

Location 

id, name, ukprn, lat, long, institute 

ukprn是通過政府給予的唯一的ID,但在未來的某個機構可能沒有這個,所以我不想具體使用作爲參考。我認爲我需要做的是讓Location.institute屬性包含Institute.ukprn和Location.ukprn匹配的Institute.id,但我不確定這將如何工作並將其保存到代碼中。

我想:

Location.each do |location| 
    if location.ukprn == Institute.ukprn then 
    put Institute.id => Location.institute 
    end 
end 

這想出了一個未定義的方法 '每個' 錯誤。我顯然做錯了什麼,但不知道如何去做這件事。

回答

1

你會得到undefined method each error,因爲位置作爲模型類沒有每種方法。還有其他的東西在你的代碼中是錯誤的。

你必須這樣做以如下方式,

Institute.find_each do |institute| 
    Location.where(ukprn: institute.ukprn).update_all(institute_id: institute.id) 
end 

在上面的代碼爲你檢查對應於所有位置ukprn每個機構,每個匹配的位置的institute_id將與學院ID更新。

+1

你可以考慮使用find_each而不是all.each。這樣它將會更快,並且在運行時會佔用更少的內存。 –

+0

@SatyamSingh是的。你是對的。更新了我的答案。 – dnsh

+0

這是完美的。感謝代碼和解釋傢伙! –

0

調用每個類的方法沒有任何意義。首先讓所有的地點和機構,做一些象下面這樣:

@locations = Location.all 
@institutes = Institute.all 

@locations.each do |location| 
    @institutes.each do |institute| 
    if location.ukprn == institute.ukprn 
    institute.id = location.institute 
    institute.save! 
    end 
    end 
end 

我猜有可能是一個更好的方式,不使用每個遍歷每個記錄,如優化查詢,你可以刪除/關口記錄爲「已處理」,然後再獲取「未處理」記錄,以便在後續的each循環中減小陣列大小。

希望它有幫助!讓我知道你是否看起來像這樣。