Commit 3d572c269bcb5738226582aa70549001b4af8c07
1 parent
c23f40da
Exists in
master
and in
22 other branches
[catalog-categories] Adding base names_scopes on product and category
Showing
4 changed files
with
108 additions
and
0 deletions
Show diff stats
app/models/category.rb
| ... | ... | @@ -13,6 +13,16 @@ class Category < ActiveRecord::Base |
| 13 | 13 | {:conditions => ['parent_id is null and environment_id = ?', environment.id ]} |
| 14 | 14 | } |
| 15 | 15 | |
| 16 | + named_scope :on_level, lambda { |parent| {:conditions => {:parent_id => parent}} } | |
| 17 | + | |
| 18 | + named_scope :sub_categories, lambda { |category| | |
| 19 | + {:conditions => ['categories.path LIKE ? AND categories.id != ?', "%#{category.slug}%", category.id]} | |
| 20 | + } | |
| 21 | + | |
| 22 | + named_scope :sub_tree, lambda { |category| | |
| 23 | + {:conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} | |
| 24 | + } | |
| 25 | + | |
| 16 | 26 | acts_as_filesystem |
| 17 | 27 | |
| 18 | 28 | has_many :article_categorizations, :dependent => :destroy | ... | ... |
app/models/product.rb
| ... | ... | @@ -23,6 +23,10 @@ class Product < ActiveRecord::Base |
| 23 | 23 | |
| 24 | 24 | named_scope :more_recent, :order => "created_at DESC" |
| 25 | 25 | |
| 26 | + named_scope :from_category, lambda { |category| | |
| 27 | + {:joins => :product_category, :conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} if category | |
| 28 | + } | |
| 29 | + | |
| 26 | 30 | after_update :save_image |
| 27 | 31 | |
| 28 | 32 | def lat | ... | ... |
test/unit/category_test.rb
| ... | ... | @@ -552,4 +552,62 @@ class CategoryTest < ActiveSupport::TestCase |
| 552 | 552 | cat.save! |
| 553 | 553 | end |
| 554 | 554 | |
| 555 | + should 'return categories of a level' do | |
| 556 | + c1 = fast_create(Category) | |
| 557 | + c2 = fast_create(Category) | |
| 558 | + c3 = fast_create(Category, :parent_id => c1) | |
| 559 | + c4 = fast_create(Category, :parent_id => c1) | |
| 560 | + c5 = fast_create(Category, :parent_id => c2) | |
| 561 | + c6 = fast_create(Category, :parent_id => c3) | |
| 562 | + | |
| 563 | + assert_includes Category.on_level(nil), c1 | |
| 564 | + assert_includes Category.on_level(nil), c2 | |
| 565 | + assert_includes Category.on_level(c1), c3 | |
| 566 | + assert_includes Category.on_level(c1), c4 | |
| 567 | + assert_includes Category.on_level(c2), c5 | |
| 568 | + assert_includes Category.on_level(c3), c6 | |
| 569 | + end | |
| 570 | + | |
| 571 | + should 'on level named_scope must be able to receive parent or parent_id' do | |
| 572 | + parent = fast_create(Category) | |
| 573 | + category = fast_create(Category, :parent_id => parent) | |
| 574 | + | |
| 575 | + assert_includes Category.on_level(parent), category | |
| 576 | + assert_includes Category.on_level(parent.id), category | |
| 577 | + end | |
| 578 | + | |
| 579 | + should 'list category sub-categories' do | |
| 580 | + c1 = Category.create!(:name => 'Category 1', :environment => Environment.default) | |
| 581 | + c2 = Category.create!(:name => 'Category 2', :environment => Environment.default) | |
| 582 | + c3 = Category.create!(:name => 'Category 3', :environment => Environment.default, :parent_id => c1) | |
| 583 | + c4 = Category.create!(:name => 'Category 4', :environment => Environment.default, :parent_id => c1) | |
| 584 | + c5 = Category.create!(:name => 'Category 5', :environment => Environment.default, :parent_id => c3) | |
| 585 | + | |
| 586 | + sub_categories = Category.sub_categories(c1) | |
| 587 | + | |
| 588 | + assert ActiveRecord::NamedScope::Scope, sub_categories.class | |
| 589 | + assert_not_includes sub_categories, c1 | |
| 590 | + assert_not_includes sub_categories, c2 | |
| 591 | + assert_includes sub_categories, c3 | |
| 592 | + assert_includes sub_categories, c4 | |
| 593 | + assert_includes sub_categories, c5 | |
| 594 | + end | |
| 595 | + | |
| 596 | + should 'list category sub-tree' do | |
| 597 | + c1 = Category.create!(:name => 'Category 1', :environment => Environment.default) | |
| 598 | + c2 = Category.create!(:name => 'Category 2', :environment => Environment.default) | |
| 599 | + c3 = Category.create!(:name => 'Category 3', :environment => Environment.default, :parent_id => c1) | |
| 600 | + c4 = Category.create!(:name => 'Category 4', :environment => Environment.default, :parent_id => c1) | |
| 601 | + c5 = Category.create!(:name => 'Category 5', :environment => Environment.default, :parent_id => c3) | |
| 602 | + | |
| 603 | + sub_tree = Category.sub_tree(c1) | |
| 604 | + | |
| 605 | + assert ActiveRecord::NamedScope::Scope, sub_tree.class | |
| 606 | + assert_includes sub_tree, c1 | |
| 607 | + assert_not_includes sub_tree, c2 | |
| 608 | + assert_includes sub_tree, c3 | |
| 609 | + assert_includes sub_tree, c4 | |
| 610 | + assert_includes sub_tree, c5 | |
| 611 | + end | |
| 612 | + | |
| 555 | 613 | end | ... | ... |
test/unit/product_test.rb
| ... | ... | @@ -772,4 +772,40 @@ class ProductTest < ActiveSupport::TestCase |
| 772 | 772 | assert_equal [prod3, prod2, prod1], Product.more_recent |
| 773 | 773 | end |
| 774 | 774 | |
| 775 | + should 'return products from a category' do | |
| 776 | + pc1 = ProductCategory.create!(:name => 'PC1', :environment => Environment.default) | |
| 777 | + pc2 = ProductCategory.create!(:name => 'PC2', :environment => Environment.default) | |
| 778 | + pc3 = ProductCategory.create!(:name => 'PC3', :environment => Environment.default, :parent => pc1) | |
| 779 | + p1 = fast_create(Product, :product_category_id => pc1) | |
| 780 | + p2 = fast_create(Product, :product_category_id => pc1) | |
| 781 | + p3 = fast_create(Product, :product_category_id => pc2) | |
| 782 | + p4 = fast_create(Product, :product_category_id => pc3) | |
| 783 | + | |
| 784 | + products = Product.from_category(pc1) | |
| 785 | + | |
| 786 | + assert_includes products, p1 | |
| 787 | + assert_includes products, p2 | |
| 788 | + assert_not_includes products, p3 | |
| 789 | + assert_includes products, p4 | |
| 790 | + end | |
| 791 | + | |
| 792 | + should 'not crash if nil is passed to from_category' do | |
| 793 | + assert_nothing_raised do | |
| 794 | + Product.from_category(nil) | |
| 795 | + end | |
| 796 | + end | |
| 797 | + | |
| 798 | + should 'return from_category scope untouched if passed nil' do | |
| 799 | + enterprise = fast_create(Enterprise) | |
| 800 | + p1 = fast_create(Product, :enterprise_id => enterprise.id) | |
| 801 | + p2 = fast_create(Product, :enterprise_id => enterprise.id) | |
| 802 | + p3 = fast_create(Product, :enterprise_id => enterprise.id) | |
| 803 | + | |
| 804 | + products = enterprise.products.from_category(nil) | |
| 805 | + | |
| 806 | + assert_includes products, p1 | |
| 807 | + assert_includes products, p2 | |
| 808 | + assert_includes products, p3 | |
| 809 | + end | |
| 810 | + | |
| 775 | 811 | end | ... | ... |