Нетерпеливая загрузка в ActiveJob

У меня есть ActiveJob с некоторыми параметрами, которые были сериализованы с помощью GlobalID.

При выполнении задания, как я могу загрузить некоторые связанные модели?

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

Это всего лишь простой пример, но в моем приложении мне нужно будет загрузить несколько моделей, и иногда у меня даже без этого возникает N + 1 проблема (на разных примерах, без активной загрузки)


person Cyril Duchon-Doris    schedule 30.04.2016    source источник


Ответы (1)


Я не понимаю, почему это может вызвать проблему 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. Активному заданию необходимо сериализовать объект перед его вставкой в ​​очередь, поэтому иногда проще и проще получить объект из базы данных по ссылке id.

person Anthony E    schedule 30.04.2016
comment
Таким образом, трюк с globalID становится бесполезным, если нам нужна Eager Loading? - person Cyril Duchon-Doris; 30.04.2016