2017-07-28 19 views
0

カテゴリadがあります。 カテゴリhas_many:広告 + カウンタキャッシュ:ads_count。私はgem awesome_nested_setを使用してネストされたカテゴリを作成します。したがって、カテゴリ1はカテゴリ2の親/子になります。カテゴリ3の親となることができます。カテゴリ#インデックスに必要なものは、特定のカテゴリや子供に属する広告カテゴリ(または「孫」など)。私の解決策は、some_nested_categories.sum(:ads_count)です。しかし、インデックスページに多数のカテゴリがあると、そのすべてのデータを取得するために多くのクエリが実行され、時間がかかりすぎるとします。これをより効率的にするにはどうすればいいですか?手伝ってくれてありがとう!ネストされたモデルの数の合計

答えて

0

counter_cacheのアイディアを手動でsum_cacheの種類に拡張することができます。nested_ads_countとすることができます。さ

その後、カテゴリが新しいが

  • カテゴリを追加します

    • 処理する必要がある4一般的な例が存在することになる新しい親カテゴリ」
    • カテゴリに「移動/追加」削除された(あるいは親から削除)親のnested_ads_countときのいずれか、現在のnested_ads_countまたは012を更新し、」

    after_updateコールバックを取得します更新。最初のケースを解決します。

    awesome_nested_setはafter_addafter_removeコールバックnested_ads_countを再計算を使用して、他の2例

    を解決します。

    計算し、この

    def reset_nested_ads_count 
        self.nested_ads_count = some_nested_categories.sum(:nested_ads_count) + self.ads_count 
    end 
    

    この方法のようになりますnested_ads_countをキャッシュする方法が最適である場合に使用され、カウントはそれだけでないとして、それが更新される頻度よりも大きいことを周波数数が更新されるときに時間がかかる高価なクエリであり、数が見られる必要があるときではありません。

    あなたの巣にループがある場合(a> b> a、またはさらに狡猾な> b> c> ...> a)自分自身を得ることができます無限ループでawesome_nested_setがこのケースをブロックしていることを明示的に示しているものは見ていません。

  • +0

    look&sounds good、thx – Mart17

    関連する問題