0

私は最初の実際の 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 呼び出しを削除することでパフォーマンスが向上することを期待していました。

私が知りたいのは、これで正しい軌道に乗っているか、これを改善するにはどうすればよいかということです。

4

2 に答える 2

0

ActiveRecord レベルの最適化とは別に、Sectionタイムスタンプによる s のキャッシュを検討しましたか? そうすれば、データベースが更新されたときにのみデータベースに戻りますSection(したがって、キャッシュが期限切れになります)。

キャッシングについてはこちらが参考になります。HTTP キャッシングを使用すると、Rails スタックにアクセスする必要さえありません。

于 2013-10-19T17:46:46.650 に答える