ステータスが「オープン」のイベントのデータベース (イベント モデル) からデータを取得し、2 つの異なるクラスのメソッドを呼び出してこれらのイベントを処理するレーキ タスクがあります。1 つ目は何らかの条件に基づいてイベントをバッチ処理し、もう 1 つのクローラーはこれらのイベント バッチの CSV を生成し、その CSV を外部 Web サイトにアップロードします。その後、クロールの実行が終了した後に、それらのバッチを参照する各イベントのステータスを更新します。
Active Record オブジェクトをこれら 2 つのクラスのメソッドに渡す方法は 2 つあります。
- ActiveRecord オブジェクトを 2 つのクラスに渡す (現在の実装)
- オブジェクトのデータベース テーブル ID を渡し、それらの各クラスからフェッチするだけです。
これらのオプションのうち、「におい」が少ないのはどれですか。私の脳は、ID が他のクラスに到達すると別のデータベース クエリを実行することで、ID を渡すとパフォーマンスが低下することを教えてくれます。一方、更新されるのはステータスだけであるため、すべてのデータを ActiveRecord オブジェクトに渡すことは不必要に思えます。では、どのオプションがより良いものでしょうか? 私が意味することを明確に理解するために、rake タスクを含めました。
desc "Process open Events ..."
task :process_open_events => :environment do
open_events = Event.find_all_by_status("Open")
event_batches = EventUtils::EventProcessor.create_event_batches(open_events)
crawler = EventsCrawler.create!
crawler.enqueue_crawler(event_batches)
end