Foo
私はいくつかの属している関係を持つモデルを持っています。ここではそれらをBar
および と呼び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
基礎となる MySQL ステートメントは非常に高速 (~0.5 ミリ秒) でしたが、異常に遅い (~4 秒) ことに気付きました。bar
との呼び出しのベンチマークbaz
を行ったところ、Rails 関連付けコードを実行するだけで、それぞれ ~2.3 秒と ~221 ミリ秒かかることがわかりました。
次に、次のメソッドを入れます。
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 の目的を無効にします)。
だから、私は代替案を探しています:
- 物事を遅くしている可能性のある間違ったことをしている可能性はありますか? (実際のコードは明らかにこれより複雑です。ただし、begs_to は正確です。実際のコードには追加のオプションはありません)。
- 他の人はこれに遭遇しましたか?
- 彼らはそれにどのように対処しましたか?