diff --git a/app/models/spree/classification.rb b/app/models/spree/classification.rb index 7f7b1579ec..3cad99c8e1 100644 --- a/app/models/spree/classification.rb +++ b/app/models/spree/classification.rb @@ -1,7 +1,18 @@ module Spree class Classification < ActiveRecord::Base self.table_name = 'spree_products_taxons' - belongs_to :product, class_name: "Spree::Product" - belongs_to :taxon, class_name: "Spree::Taxon" + belongs_to :product, class_name: "Spree::Product", touch: true + belongs_to :taxon, class_name: "Spree::Taxon", touch: true + + before_destroy :dont_destroy_if_primary_taxon + + private + + def dont_destroy_if_primary_taxon + if product.primary_taxon == taxon + errors.add :base, I18n.t(:spree_classification_primary_taxon_error, taxon: taxon.name, product: product.name) + false + end + end end end diff --git a/app/models/spree/classification_decorator.rb b/app/models/spree/classification_decorator.rb deleted file mode 100644 index 20608bad94..0000000000 --- a/app/models/spree/classification_decorator.rb +++ /dev/null @@ -1,15 +0,0 @@ -Spree::Classification.class_eval do - belongs_to :product, class_name: "Spree::Product", touch: true - belongs_to :taxon, class_name: "Spree::Taxon", touch: true - - before_destroy :dont_destroy_if_primary_taxon - - private - - def dont_destroy_if_primary_taxon - if product.primary_taxon == taxon - errors.add :base, I18n.t(:spree_classification_primary_taxon_error, taxon: taxon.name, product: product.name) - false - end - end -end diff --git a/app/models/spree/taxon.rb b/app/models/spree/taxon.rb index 2d9cbb4a4d..b1adbd61d4 100644 --- a/app/models/spree/taxon.rb +++ b/app/models/spree/taxon.rb @@ -3,7 +3,7 @@ module Spree acts_as_nested_set dependent: :destroy belongs_to :taxonomy, class_name: 'Spree::Taxonomy', :touch => true - has_many :classifications, dependent: :delete_all + has_many :classifications, dependent: :destroy has_many :products, through: :classifications before_create :set_permalink @@ -22,16 +22,9 @@ module Spree include Spree::Core::ProductFilters # for detailed defs of filters - # indicate which filters should be used for a taxon - # this method should be customized to your own site + # Indicate which filters should be used for this taxon def applicable_filters - fs = [] - # fs << ProductFilters.taxons_below(self) - ## unless it's a root taxon? left open for demo purposes - - fs << Spree::Core::ProductFilters.price_filter if Spree::Core::ProductFilters.respond_to?(:price_filter) - fs << Spree::Core::ProductFilters.brand_filter if Spree::Core::ProductFilters.respond_to?(:brand_filter) - fs + [] end # Return meta_title if set otherwise generates from root name and/or taxon name @@ -69,5 +62,41 @@ module Spree ancestor_chain + "#{name}" end + # Find all the taxons of supplied products for each enterprise, indexed by enterprise. + # Format: {enterprise_id => [taxon_id, ...]} + def self.supplied_taxons + taxons = {} + + Spree::Taxon. + joins(products: :supplier). + select('spree_taxons.*, enterprises.id AS enterprise_id'). + each do |t| + taxons[t.enterprise_id.to_i] ||= Set.new + taxons[t.enterprise_id.to_i] << t.id + end + + taxons + end + + # Find all the taxons of distributed products for each enterprise, indexed by enterprise. + # May return :all taxons (distributed in open and closed order cycles), + # or :current taxons (distributed in an open order cycle). + # + # Format: {enterprise_id => [taxon_id, ...]} + def self.distributed_taxons(which_taxons = :all) + ents_and_vars = ExchangeVariant.joins(exchange: :order_cycle).merge(Exchange.outgoing) + .select("DISTINCT variant_id, receiver_id AS enterprise_id") + + ents_and_vars = ents_and_vars.merge(OrderCycle.active) if which_taxons == :current + + taxons = Spree::Taxon + .select("DISTINCT spree_taxons.id, ents_and_vars.enterprise_id").joins(products: :variants_including_master) + .joins("INNER JOIN (#{ents_and_vars.to_sql}) AS ents_and_vars ON spree_variants.id = ents_and_vars.variant_id") + + taxons.each_with_object({}) do |t, ts| + ts[t.enterprise_id.to_i] ||= Set.new + ts[t.enterprise_id.to_i] << t.id + end + end end end diff --git a/app/models/spree/taxon_decorator.rb b/app/models/spree/taxon_decorator.rb deleted file mode 100644 index f2c6f1e20a..0000000000 --- a/app/models/spree/taxon_decorator.rb +++ /dev/null @@ -1,47 +0,0 @@ -Spree::Taxon.class_eval do - has_many :classifications, dependent: :destroy - - # Indicate which filters should be used for this taxon - def applicable_filters - fs = [] - # fs << Spree::ProductFilters.distributor_filter if Spree::ProductFilters.respond_to? :distributor_filter - fs - end - - # Find all the taxons of supplied products for each enterprise, indexed by enterprise. - # Format: {enterprise_id => [taxon_id, ...]} - def self.supplied_taxons - taxons = {} - - Spree::Taxon. - joins(products: :supplier). - select('spree_taxons.*, enterprises.id AS enterprise_id'). - each do |t| - taxons[t.enterprise_id.to_i] ||= Set.new - taxons[t.enterprise_id.to_i] << t.id - end - - taxons - end - - # Find all the taxons of distributed products for each enterprise, indexed by enterprise. - # May return :all taxons (distributed in open and closed order cycles), - # or :current taxons (distributed in an open order cycle). - # - # Format: {enterprise_id => [taxon_id, ...]} - def self.distributed_taxons(which_taxons = :all) - ents_and_vars = ExchangeVariant.joins(exchange: :order_cycle).merge(Exchange.outgoing) - .select("DISTINCT variant_id, receiver_id AS enterprise_id") - - ents_and_vars = ents_and_vars.merge(OrderCycle.active) if which_taxons == :current - - taxons = Spree::Taxon - .select("DISTINCT spree_taxons.id, ents_and_vars.enterprise_id").joins(products: :variants_including_master) - .joins("INNER JOIN (#{ents_and_vars.to_sql}) AS ents_and_vars ON spree_variants.id = ents_and_vars.variant_id") - - taxons.each_with_object({}) do |t, ts| - ts[t.enterprise_id.to_i] ||= Set.new - ts[t.enterprise_id.to_i] << t.id - end - end -end