ActiveJob中的Eager Load

时间:2016-04-30 15:46:13

标签: ruby-on-rails mongoid ruby-on-rails-5

我有一个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

这只是一个简单的例子,但在我的应用程序中,我需要eager_load几个模型,并且我没有它就会出现N + 1个问题(在不同的例子中,没有急切的加载)

1 个答案:

答案 0 :(得分:0)

如果foobar是单数项,我不明白这会导致N + 1问题的原因。

否则,急切加载在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引用更简单,更容易从数据库中获取对象。