2016-04-30 6 views
2

У меня есть ActiveJob с некоторыми параметрами, которые были сериализованы с помощью GlobalID.Eager Load in 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 несколько моделей, и smetimes У меня даже есть N + 1 проблемы без него (на разных примерах, без нетерпеливого нагрузки)

ответ

0

I не вижу, почему это вызовет проблему N + 1, если foo и bar являются особыми элементами.

В противном случае, нетерпеливые погрузочные работы в ActiveJob так же, как ActionControler, или в любом другом месте:

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 

Кроме того, если это возможно, вы должны (например, id), а не объекты для вашего метода perform. Active Job необходимо сериализовать объект, прежде чем вставлять его в очередь, поэтому иногда его проще и проще извлекать объект из базы данных с помощью ссылки id.

+1

Итак, в принципе, [globalID] (http://edgeguides.rubyonrails.org/active_job_basics.html#globalid) трюк становится бесполезным, если нам нужна Eager Loading? –

Смежные вопросы