私は最初の実際の Rails プロジェクトを仕上げており、時間をかけて戻って効率/パフォーマンスを向上させようとしています。
たとえば、Section
特定のセクションが他のセクションの親および/または子になることができるほど再帰的なモデル(以下に簡略化)があります。
セクション
class Section < ActiveRecord::Base
default_scope order('sections.id ASC')
attr_accessible :name,
:parent_id
def children(all_sections)
# ::ORIGINAL CODE::
# return Section.where(parent_id: id)
# ::OPTIMIZED CODE THAT REMOVES ADDITIONAL DB CALLS::
children = []
all_sections.each do |sec|
children.push(sec) if sec.parent_id == id
end
return children
end
end
最初は、すべてのセクションを取得し、それらをループして、children
各セクションを呼び出して特定のセクションの子を取得していました。上記のコードを変更したので、すべてのセクションを渡し、それらをループしてセクションの子を取得します。
footer.html.haml
- @sections = Section.all
%footer
- @sections.each do |section|
- if section.parent_id == 0
%nav{:id=>"#{section.name}"}
%h1
= section.name
%ul
- section.children(@sections).each do |subsection|
%li
= subsection.name
これはフッターであり、すべてのページでレンダリングされるため、追加の DB 呼び出しを削除することでパフォーマンスが向上することを期待していました。
私が知りたいのは、これで正しい軌道に乗っているか、これを改善するにはどうすればよいかということです。