Ruby on rails ActiveJob中的即时加载
我有一个带有一些参数的ActiveJob,这些参数已经用GlobalID序列化 执行作业时,如何加载一些关联模型Ruby on rails ActiveJob中的即时加载,ruby-on-rails,mongoid,ruby-on-rails-5,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 ? f
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
class-Foo
有一个:酒吧
结束
分类栏
属于:富
领域:一些领域
结束
类MyJob
这只是一个简单的例子,但在我的应用程序中,我需要快速加载多个模型,有时我甚至在没有它的情况下出现N+1问题(在不同的示例中,没有快速加载)如果
foo
和bar
是单数项,我不明白为什么这会导致N+1问题
否则,即时加载在ActiveJob中工作,就像ActionController或其他任何地方一样:
class Foo
has_many :bars
end
class Bar
belongs_to :foo
field :some_field
def title
"Title"
end
end
您可以像这样加载:条关联:
foo = Foo.find(id).includes(:bars)
foo.find_each do |foo_item|
# Process foo.bar.title without needing another query...
end
此外,如果可能,您应该将primivies(例如id
)而不是对象传递给perform
方法。活动作业在将对象插入队列之前需要序列化对象,因此有时通过id
引用从数据库中获取对象更简单、更容易。因此,如果我们需要快速加载,基本上这个技巧就没用了?