2012-06-03 83 views
2

我有一個Category模型,其中category可能有一些子類別(category.categories)。我想要一個範圍,讓我所有Category s沒有分categoriesRails範圍檢查沒有關聯

換句話說,我可以寫

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

我使用rails 3.2,activerecord和postgresql。 – Peter

回答

4

最好的做法是通過實現緩存計數減少數據庫查詢。 在rails中,通過向belongs_to關聯添加一個選項:counter_cache => true非常簡單。這假定您在類別數據庫表中創建一個'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 

希望這對我有所幫助。

+1

在這種情況下,甚至不需要'lambda',只需'scope:without_subcategories,其中(:categories_count => 0)'就足夠了。 –

+0

ta mu,更新了答案 –

+0

@viktortron:同伴獼猴桃? :) – Peter