我有一个Category
模型,category
可能有一些子类别(category.categories
)。我想要一个范围,它为我提供了没有子Category
的所有categories
。
换句话说,我可以写
without_subcategories = Category.select{|category| category.categories.none?}
但是我想把它写成scope
。我该怎么做?
如果不清楚,这是我的模型:
class Category < ActiveRecord::Base
belongs_to :parent, class_name: 'Category'
has_many :categories, foreign_key: :parent_id, class_name: 'Category'
scope :without_subcategories, lambda { WHAT GOES IN HERE? }
end
答案 0 :(得分:4)
最佳做法是通过实现计数器缓存来最小化数据库查询。
在rails中,通过向belongs_to关联添加选项:counter_cache => true
,这非常简单。这假设您在类别db表中创建'categories_count'
整数列。鉴于此,您的范围是微不足道的。
class Category < ActiveRecord::Base
belongs_to :parent, class_name: 'Category', :counter_cache => true
has_many :categories, foreign_key: :parent_id, class_name: 'Category'
scope :without_subcategories, where(categories_count: 0)
end
希望这会有所帮助。