0

import_items という機能を構築しています。

ロジックはいくぶん複雑で連続的です。

# Step 1. See if User has a remote source set up.
# Step 2. If yes (it's set up) - load that CSV file.
# Step 3. Convert CSV to Hashes 
# Step 4. Reject CSV rows that don't belong to the user 
#         (export feed can have items of other users)
# Step 5. Convert remaining hashes into hashes my DB can accept
# Step 6. For each hash in that array start Item.delay.create(hash)
#         (want it to go through Sidekiq because user can import say 500 items, 
#          which takes time, some of them can fail etc)

1 つのステップが失敗した場合、次のすべてのステップを実行しないでください。

そして、これはすべてバックグラウンド ジョブで実行する必要があります。

通常、この種の機能はどのように記述しますか?

今のところ私が考えた唯一の方法は、それをステップに分割し、各ステップで遅延ジョブを実行することです。

class User < ActiveRecord::Base
  def import_items
    self.delay.load_CSV if self.dms and self.dms_id
  end

  def load_CSV
    result = ... (loading CSV file, convert rows to hashes)
    self.delay.keep_only_user_items(result) if result
  end

  def keep_only_user_items(all_items)
    result = ... (rejecting wrong items)
    self.delay.convert_to_proper_hashes(result)
  end

  ... # etc
end

それは良い方法ですか?

各ステップをテストして、正しく機能することを確認したいだけです。

4

1 に答える 1

0

ここで DelayedJob を早く返す必要はありません。それは物事を複雑にするだけです。ロジックを小さなメソッドに分割するだけで、エラーが発生した場合は続行しません。要するに、delayコードから を削除すると、うまくいくはずです。

通常、非常に長く複雑なメソッドをどのように記述しますか?

長くて複雑なメソッドを記述しません。小さくて単純なメソッドを記述します。それは報われるでしょう。

class User < ActiveRecord::Base
  def import_items
    load_CSV if self.dms and self.dms_id
  end

  def load_CSV
    result = ... (loading CSV file, convert rows to hashes)
    keep_only_user_items(result) if result
  end

  def keep_only_user_items(all_items)
    result = ... (rejecting wrong items)
    convert_to_proper_hashes(result)
  end
end
于 2013-10-22T09:31:19.977 に答える