Commit 1d10ce614c26dd667efa94b1662c7a2f7281bf8f

Authored by Braulio Bhavamitra
1 parent 26332265

Add has_many for qualifiers/certifiers

Refactor acts_as_searchable and acts_as_faceted for products
app/models/certifier.rb
... ... @@ -2,9 +2,12 @@ class Certifier < ActiveRecord::Base
2 2  
3 3 belongs_to :environment
4 4  
5   - has_many :qualifier_certifiers
  5 + has_many :qualifier_certifiers, :dependent => :destroy
6 6 has_many :qualifiers, :through => :qualifier_certifiers
7 7  
  8 + has_many :product_qualifiers, :dependent => :destroy
  9 + has_many :products, :through => :product_qualifiers, :source => :product
  10 +
8 11 validates_presence_of :environment_id
9 12 validates_presence_of :name
10 13  
... ...
app/models/product.rb
1 1 class Product < ActiveRecord::Base
2 2 belongs_to :enterprise
  3 + has_one :region, :through => :enterprise
  4 +
3 5 belongs_to :product_category
4   - has_many :product_categorizations
5   - has_many :product_qualifiers
6   - has_many :qualifiers, :through => :product_qualifiers
  6 +
7 7 has_many :inputs, :dependent => :destroy, :order => 'position'
8 8  
  9 + has_many :product_qualifiers, :dependent => :destroy
  10 + has_many :qualifiers, :through => :product_qualifiers
  11 + has_many :certifiers, :through => :product_qualifiers
  12 +
9 13 validates_uniqueness_of :name, :scope => :enterprise_id, :allow_nil => true
10 14 validates_presence_of :product_category_id
11 15 validates_associated :product_category
... ... @@ -26,15 +30,6 @@ class Product &lt; ActiveRecord::Base
26 30 p.enterprise.product_updated if p.enterprise
27 31 end
28 32  
29   - after_save do |p|
30   - if (p.product_category && !ProductCategorization.find(:first, :conditions => {:category_id => p.product_category.id, :product_id => p.id})) || (!p.product_category)
31   - ProductCategorization.remove_all_for(p)
32   - if p.product_category
33   - ProductCategorization.add_category_to_product(p.product_category, p)
34   - end
35   - end
36   - end
37   -
38 33 xss_terminate :only => [ :name ], :on => 'validation'
39 34 xss_terminate :only => [ :description ], :with => 'white_list', :on => 'validation'
40 35  
... ... @@ -86,9 +81,11 @@ class Product &lt; ActiveRecord::Base
86 81 end
87 82  
88 83 def enterprise_updated(e)
89   - self.lat = e.lat
90   - self.lng = e.lng
91   - save!
  84 + if self.lat != e.lat or self.lng != e.lng
  85 + self.lat = e.lat
  86 + self.lng = e.lng
  87 + save!
  88 + end
92 89 end
93 90  
94 91 def url
... ... @@ -155,31 +152,51 @@ class Product &lt; ActiveRecord::Base
155 152 def name_or_category
156 153 name ? name : product_category.name
157 154 end
  155 + def price_sort
  156 + (price.nil? or price.zero?) ? 999999999.9 : price
  157 + end
158 158 def f_category
159   - #def childs(id)
160   - #ret = ProductCategory.find(:all, :conditions => {:parent_id => id}).collect(&:id)
161   - #([id, ret.map { |i| childs(i) }])
162   - #end
163   - #childs(self.product_category.id).flatten
164 159 self.product_category.name
165 160 end
166 161 def f_region
167   - self.enterprise.region.name if self.enterprise.region
  162 + self.enterprise.region.id if self.enterprise.region
  163 + end
  164 + def self.f_region_proc(id)
  165 + c = Region.find(id)
  166 + s = c.parent
  167 + if c and c.kind_of?(City) and s and s.kind_of?(State) and s.acronym
  168 + [c.name, ', ' + s.acronym]
  169 + else
  170 + c.name
  171 + end
  172 + end
  173 + def self.f_qualifier_proc(id)
  174 + pq = ProductQualifier.find(id)
  175 + if pq.certifier
  176 + [pq.qualifier.name, _(' cert. ') + pq.certifier.name]
  177 + else
  178 + pq.qualifier.name
  179 + end
168 180 end
169 181 def f_qualifier
170   - product_qualifiers.collect{|i| i.qualifier.name if i.qualifier} +
171   - product_qualifiers.collect{|i| i.certifier.name if i.certifier}
  182 + product_qualifier_ids
172 183 end
173 184 public
174 185  
175 186 acts_as_faceted :fields => {
176 187 :f_category => {:label => _('Related products')},
177   - :f_region => {:label => _('Region')},
178   - :f_qualifier => {:label => _('Qualifiers')}},
  188 + :f_region => {:label => _('City'), :proc => proc { |id| f_region_proc(id) }},
  189 + :f_qualifier => {:label => _('Qualifiers'), :proc => proc { |id| f_qualifier_proc(id) }}},
  190 + :category_query => proc { |c| "f_category:\"#{c.name}\"" },
179 191 :order => [:f_category, :f_region, :f_qualifier]
180 192  
181   - acts_as_searchable :fields => [{:name_or_category => {:type => :text, :as => :name, :boost => 2.0}},
182   - {:name_or_category => {:type => :string, :as => :name_sort}}, :description, {:price => :float}, :category_full_name ] + facets.keys.map{|i| {i => :facet}},
  193 + acts_as_searchable :additional_fields => [
  194 + {:name => {:type => :text, :boost => 5.0}},
  195 + {:price_sort => {:type => :decimal}},
  196 + {:name_or_category => {:type => :string, :as => :name_or_category_sort, :boost => 2.0}},
  197 + :category_full_name ] + facets.keys.map{|i| {i => :facet}},
  198 + :include => [:enterprise, :qualifiers, :certifiers, :product_category],
  199 + :boost => proc {|p| 10 if p.enterprise.enabled},
183 200 :facets => facets.keys
184 201  
185 202 end
... ...
app/models/qualifier.rb
... ... @@ -2,14 +2,15 @@ class Qualifier &lt; ActiveRecord::Base
2 2  
3 3 belongs_to :environment
4 4  
5   - has_many :qualifier_certifiers
  5 + has_many :qualifier_certifiers, :dependent => :destroy
6 6 has_many :certifiers, :through => :qualifier_certifiers
7 7  
  8 + has_many :product_qualifiers, :dependent => :destroy
  9 + has_many :products, :through => :product_qualifiers, :source => :product
  10 +
8 11 validates_presence_of :environment_id
9 12 validates_presence_of :name
10 13  
11   - has_many :product_qualifiers, :dependent => :destroy
12   -
13 14 def <=>(b)
14 15 self.name.downcase.transliterate <=> b.name.downcase.transliterate
15 16 end
... ...
app/models/qualifier_certifier.rb
1 1 class QualifierCertifier < ActiveRecord::Base
2 2 belongs_to :qualifier
3 3 belongs_to :certifier
  4 +
  5 + validates_presence_of :qualifier
4 6 end
... ...