2016-04-30 15 views
2

私は、GlobalIDでシリアライズされたいくつかのパラメータを持つActiveJobを持っています。ActiveJobで熱心な負荷

ジョブを実行するとき、どのように関連するモデルを読み込むことができますか?

class Foo 
    has_one :bar 
end 

class Bar 
    belongs_to :foo 
    field :some_field 
end 

class MyJob < ApplicationJob 
    queue_as :default 

    def perform(foo) 
    # How can I eager load bar ? 
    foo.bar.some_field # Hits the DB again without eager loading 
    end 
end 

は、これは単純な例ですが、私のアプリでは、私はいくつかのモデルをeager_loadする必要があるだろう、と(積極的なロードせずに、別の例で)私もそれなしN + 1つの問題を抱えている

答えて

0

Iをsmetimes foobarが特異なアイテムである場合、N + 1の問題を引き起こす原因がわかりません。

そうでない場合は、単にどこか他のActionControler、などActiveJobでイーガーローディング作品は:

class Foo 
    has_many :bars 
end 

class Bar 
    belongs_to :foo 
    field :some_field 

    def title 
    "Title" 
    end 
end 

あなたが希望熱心な負荷がそうのような:bars協会:また

foo = Foo.find(id).includes(:bars) 

foo.find_each do |foo_item| 
    # Process foo.bar.title without needing another query... 
end 

、可能ならば、あなたがすべきあなたのperformメソッドにオブジェクトではなくプリミティブ(例:id)を渡します。アクティブなジョブはキューにオブジェクトを挿入する前にオブジェクトをシリアル化する必要があるため、id参照を介してオブジェクトをデータベースから取得する方が簡単で簡単です。

+1

Eager Loadingが必要な場合、基本的に[globalID](http://edgeguides.rubyonrails.org/active_job_basics.html#globalid)のトリックは役に立たなくなりますか? –