カテゴリセットに属するカテゴリのセットがあります。これらのカテゴリ自体には、カテゴリ(自己参照)と質問が混在している場合があります。モデルとその関係は、次のように定義および視覚化されます。
class CategorySet < ActiveRecord::Base
has_many :categories
end
class Category < ActiveRecord::Base
belongs_to :category_set
belongs_to :parent_category, :class_name => "Category"
has_many :categories, :class_name => "Category", :foreign_key => "parent_category_id", dependent: :destroy
has_many :questions, dependent: :destroy
end
class Question < ActiveRecord::Base
belongs_to :category
end
Abbrev to CS, C and Q:
CS
|- C
|- Q
|
|- C
|
|- C
| |- Q
|
|- C
|- Q
|- Q
CategorySet.find(1).questionsに質問して、位置に関係なくツリー内のすべての質問を返すことができるようにしたいと思います。私が考えることができる唯一の方法は、多くの関数ベースの要求を使用し、SQLステートメントではおそらくやり過ぎでしょう(例については以下を参照してください)。
CategorySet.find(1).categoriesを呼び出すと、カテゴリセットの直接の子孫カテゴリのみが検索されます。また、Category.find(id).questionsは、そのカテゴリの質問のみを返します。
カテゴリの.questionsメソッドを上書きしようとしましたが、それはあまりレール関係に似ていないようで、これを行うためのより良い方法があるはずです。つまり、CategorySet.includes(:questions).allスタイルの構文を実行できないため、データベースサーバーの負荷が大幅に軽減されます。