我有幾個belongs_to的關聯的模型Foo
;我在這裏將它們稱爲Bar
和Baz
。因此,該模型是這樣的:慢belongs_to的關聯中的Rails 3
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
和baz
調用進行了基準測試,發現他們分別花費了大約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是準確的;實際代碼沒有額外的選項)。
- 有其他人遇到過嗎?
- 他們是怎麼處理的?
我不能說我以前見過這樣的事情。 754 ms看起來像是通過主鍵加載記錄的大量時間。 –