0

モデルのすべてのテーブル行をサプライヤーからの 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の結果は昇順で返されるので、すでにソートされているので、実際よりも良くなったと思いましたか?

4

1 に答える 1

1

配列の違いを試していないのはなぜですか。最初に db_numbers と Listed_numbers の 2 つの配列を作成し、次のように大きい方の配列から小さい方の配列を減算します。

def self.orphaned_in_db
  db_numbers = self.find(:all).map{|x| x.number}
  listed_numbers = self.all_telco.map{|x| x.number}
  orphaned_numbers = db_numbers - listed_numbers
  orphaned_results = self.find(orphaned_numbers)
  return orphaned_results
end

db_numbers から list_numbers を減算すると、一致しない結果セットが得られます。これで、データベースの orphaned_numbers に基づいて結果を見つけることができます。それははるかに高速になります。ありがとう

于 2013-11-11T11:12:47.830 に答える