我有一个Foo
带有多个 belongs_to 关联的模型;我将在这里将它们称为Bar
and Baz
。所以模型看起来像这样:
class Foo
belongs_to :bar
belongs_to :baz
def do_stuff_with_bar_and_baz
bar.do_stuff(baz)
end
end
我们注意到它do_stuff_with_bar_and_baz
异常缓慢(约 4 秒),尽管底层 MySQL 语句非常快(约 0.5 毫秒)。我对bar
andbaz
调用进行了基准测试,发现它们分别花费了大约 2.3 秒和大约 221 毫秒……只是为了通过 Rails 关联代码。
然后我输入了以下方法:
class Foo
belongs_to :bar
belongs_to :baz
def bar
Bar.find(self.bar_id)
end
def baz
Baz.find(self.baz_id)
end
def do_stuff_with_bar_and_baz
bar.do_stuff(baz)
end
end
这绕过了 ActiveRecord 关联代码并直接加载关联的记录。使用此代码,加载 do_stuff_with_bar_and_baz 中的 Bar 和 Baz 的时间分别下降到 754ms 和 5ms。
这令人沮丧。标准的 Rails 关联似乎非常低效,但我真的不想替换所有关联(这违背了大量 ActiveRecord 的目的)。
所以,我正在寻找替代品:
- 有什么我可能做错的事情会减慢速度吗?(实际代码显然比这个更复杂。但是,belongs_to 是准确的;实际代码没有其他选项)。
- 其他人遇到过这种情况吗?
- 他们是如何处理的?