Rails范围检查没有关联

时间:2012-06-03 00:50:22

标签: ruby-on-rails

我有一个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

1 个答案:

答案 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
希望这会有所帮助。