2017-01-30 14 views
0

私は研究所のテーブルと場所のテーブルを持っています。私は、スプレッドシートからデータを抽出し、現在、以下の情報を持っていますので、私は、具体的にそれを使用したくないテーブル参照の外部キーをレールで取得

Institute 

id, name, ukprn 

Location 

id, name, ukprn, lat, long, institute 

ukprnは、政府によって与えられた固有のIDですが、将来的には、いくつかの機関がこれを持っていないこと参考として私がする必要があると思うのは、Location.institute属性がInstitute.ukprと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が表示されています。あなたのコードに間違っている他のものがあります。

あなたはあなたがすべての場所に対応するukprnをチェックされている各機関のために上記のコードでは、次のように

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

これを行うには、すべての一致した場所のinstitute_idは、研究所のIDで更新されます。

+1

all.eachの代わりにfind_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 

私は例えば、各レコードをループにそれぞれを使用していないことにより、検索を最適化するためのより良い方法があるかもしれないと思い、あなたが/マークaを削除することができます"処理済み"として記録し、後で "未処理"レコードを取得して、その後の配列サイズを減らして、その後のループでは、eachループで減らします。

願っています!もしあなたがこのように見えているなら、私に知らせてください。

関連する問題