我有一组类别,属于一个类别集。这些类别本身可以包含类别(自我参照)和问题的组合。模型及其关系的定义和可视化如下:
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 样式语法,这大大减少了数据库服务器上的负载