我有一个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个问题(在不同的例子中,没有急切的加载)
答案 0 :(得分:0)
如果foo
和bar
是单数项,我不明白这会导致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
引用更简单,更容易从数据库中获取对象。