Techioz Blog

ancestry gemを使用してモデルを効率的にクエリして、特定のオブジェクトとその祖先を取得するにはどうすればよいでしょうか?

概要

Ancestry gemを使用して階層構造でカテゴリ(カテゴリモデル)を管理しています。

カテゴリにクエリを実行して、特定のカテゴリを ID で取得し、その祖先があれば結果にすべて含める必要があります。

解決策を実装しましたが、より効率的なアプローチがあるかもしれないと考えています。これまでに私が持っているものは次のとおりです。

ancestry_arr = specific_categories.pluck(:ancestry).uniq.compact

ancestry_ids = ancestry_arr.map do |string|
  string.scan(/\d+/).map(&:to_i)
end

result = specific_categories + Category.where(id: ancestry_ids.flatten)

これを達成するためのより効率的でクリーンな方法はありますか?

ベスト プラクティスに従い、クエリを最適化していることを確認したいと考えています。 ご提案や改善がございましたら、よろしくお願いいたします。

解決策

これを試して:

result = specific_categories + 
           Category.where(id: specific_categories.map(&:ancestor_ids).flatten.uniq)