diff --git a/app/models/category.rb b/app/models/category.rb index 874f560..edb1379 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -13,6 +13,16 @@ class Category < ActiveRecord::Base {:conditions => ['parent_id is null and environment_id = ?', environment.id ]} } + named_scope :on_level, lambda { |parent| {:conditions => {:parent_id => parent}} } + + named_scope :sub_categories, lambda { |category| + {:conditions => ['categories.path LIKE ? AND categories.id != ?', "%#{category.slug}%", category.id]} + } + + named_scope :sub_tree, lambda { |category| + {:conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} + } + acts_as_filesystem has_many :article_categorizations, :dependent => :destroy diff --git a/app/models/product.rb b/app/models/product.rb index 8d910e7..032c626 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -23,6 +23,10 @@ class Product < ActiveRecord::Base named_scope :more_recent, :order => "created_at DESC" + named_scope :from_category, lambda { |category| + {:joins => :product_category, :conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} if category + } + after_update :save_image def lat diff --git a/test/unit/category_test.rb b/test/unit/category_test.rb index 03b716a..f1c7a86 100644 --- a/test/unit/category_test.rb +++ b/test/unit/category_test.rb @@ -552,4 +552,62 @@ class CategoryTest < ActiveSupport::TestCase cat.save! end + should 'return categories of a level' do + c1 = fast_create(Category) + c2 = fast_create(Category) + c3 = fast_create(Category, :parent_id => c1) + c4 = fast_create(Category, :parent_id => c1) + c5 = fast_create(Category, :parent_id => c2) + c6 = fast_create(Category, :parent_id => c3) + + assert_includes Category.on_level(nil), c1 + assert_includes Category.on_level(nil), c2 + assert_includes Category.on_level(c1), c3 + assert_includes Category.on_level(c1), c4 + assert_includes Category.on_level(c2), c5 + assert_includes Category.on_level(c3), c6 + end + + should 'on level named_scope must be able to receive parent or parent_id' do + parent = fast_create(Category) + category = fast_create(Category, :parent_id => parent) + + assert_includes Category.on_level(parent), category + assert_includes Category.on_level(parent.id), category + end + + should 'list category sub-categories' do + c1 = Category.create!(:name => 'Category 1', :environment => Environment.default) + c2 = Category.create!(:name => 'Category 2', :environment => Environment.default) + c3 = Category.create!(:name => 'Category 3', :environment => Environment.default, :parent_id => c1) + c4 = Category.create!(:name => 'Category 4', :environment => Environment.default, :parent_id => c1) + c5 = Category.create!(:name => 'Category 5', :environment => Environment.default, :parent_id => c3) + + sub_categories = Category.sub_categories(c1) + + assert ActiveRecord::NamedScope::Scope, sub_categories.class + assert_not_includes sub_categories, c1 + assert_not_includes sub_categories, c2 + assert_includes sub_categories, c3 + assert_includes sub_categories, c4 + assert_includes sub_categories, c5 + end + + should 'list category sub-tree' do + c1 = Category.create!(:name => 'Category 1', :environment => Environment.default) + c2 = Category.create!(:name => 'Category 2', :environment => Environment.default) + c3 = Category.create!(:name => 'Category 3', :environment => Environment.default, :parent_id => c1) + c4 = Category.create!(:name => 'Category 4', :environment => Environment.default, :parent_id => c1) + c5 = Category.create!(:name => 'Category 5', :environment => Environment.default, :parent_id => c3) + + sub_tree = Category.sub_tree(c1) + + assert ActiveRecord::NamedScope::Scope, sub_tree.class + assert_includes sub_tree, c1 + assert_not_includes sub_tree, c2 + assert_includes sub_tree, c3 + assert_includes sub_tree, c4 + assert_includes sub_tree, c5 + end + end diff --git a/test/unit/product_test.rb b/test/unit/product_test.rb index 3d22f0f..a45590a 100644 --- a/test/unit/product_test.rb +++ b/test/unit/product_test.rb @@ -772,4 +772,40 @@ class ProductTest < ActiveSupport::TestCase assert_equal [prod3, prod2, prod1], Product.more_recent end + should 'return products from a category' do + pc1 = ProductCategory.create!(:name => 'PC1', :environment => Environment.default) + pc2 = ProductCategory.create!(:name => 'PC2', :environment => Environment.default) + pc3 = ProductCategory.create!(:name => 'PC3', :environment => Environment.default, :parent => pc1) + p1 = fast_create(Product, :product_category_id => pc1) + p2 = fast_create(Product, :product_category_id => pc1) + p3 = fast_create(Product, :product_category_id => pc2) + p4 = fast_create(Product, :product_category_id => pc3) + + products = Product.from_category(pc1) + + assert_includes products, p1 + assert_includes products, p2 + assert_not_includes products, p3 + assert_includes products, p4 + end + + should 'not crash if nil is passed to from_category' do + assert_nothing_raised do + Product.from_category(nil) + end + end + + should 'return from_category scope untouched if passed nil' do + enterprise = fast_create(Enterprise) + p1 = fast_create(Product, :enterprise_id => enterprise.id) + p2 = fast_create(Product, :enterprise_id => enterprise.id) + p3 = fast_create(Product, :enterprise_id => enterprise.id) + + products = enterprise.products.from_category(nil) + + assert_includes products, p1 + assert_includes products, p2 + assert_includes products, p3 + end + end -- libgit2 0.21.2