gpt4 book ai didi

ruby-on-rails - ActiveJob 中的预加载

转载 作者:行者123 更新时间:2023-12-04 03:38:31 24 4
gpt4 key购买 nike

我有一个 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个问题没有它(在不同的例子中,没有预先加载)

最佳答案

如果 foo,我不明白为什么这会导致 N+1 问题和 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 从数据库中获取对象更简单、更容易。引用。

关于ruby-on-rails - ActiveJob 中的预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com