モデルのすべてのテーブル行をサプライヤーからの API 呼び出しの結果と比較するレガシー コードがアプリに含まれています。
これは、サプライヤによるテーブル行の数と結果の数の両方が大幅に増加した先週までは問題なく機能していました。
テーブルの基数は 1,657 から 59,699 になり、API によって返される結果の数は ~ 150,000 です。
コードが行っていることは、API の結果を調べて、現在のテーブルの行データが見つからないかどうかを確認することです。見つかった場合、現在のデータはデータベースに存在しますが、サプライヤーから提供されたデータには存在しないため、孤立しています。
150,000 の結果を調べて、何かがそこにないかどうかを確認することは、私には特に巧妙に聞こえません。約半分の後にビューがまだロードされているため、これを実行するのにどれくらいの時間がかかるかさえわかりません。時間 :/
コントローラ
@telco_numbers = TelcoNumber.orphaned_in_db
モデル
def self.orphaned_in_db
db_numbers = self.find(:all)
listed_numbers = self.all_telco
orphaned_numbers = []
db_numbers.each do |db|
scan = listed_numbers.select{ |l| l.number == db.number}
orphaned_numbers.push(db) if scan.empty?
end
return orphaned_numbers
end
def self.some_telco(per_page, page = 1)
page = 1 if page.nil?
# this is the first api call which returns a link which is then used for the next api call
api_call = TelcoApiv3.new("post", "/numbers/#{TelcoApiv3.account_id}/allocated/all")
listed_numbers = TelcoApiv3.poll(api_call.response["link"])
return listed_numbers.collect do |ln|
ln.store("countrycode", ln["country_code"])
TelcoNumber.new ln
end
end
def self.all_telco(page = 1)
listed_numbers = some_telco(@@max_nlist_results, page)
if listed_numbers.length == @@max_nlist_results
return listed_numbers.concat(all_telco(page + 1))
else
return listed_numbers
end
end
API 結果の形式の例:
[{"country_code":"44","number":"1133508889"},....
は、モデルのテーブルnumber
の列に関連しています。number
(数値としてではなく、varchar として格納されます)。
また、APIの結果は昇順で返されるので、すでにソートされているので、実際よりも良くなったと思いましたか?