Commit 1d10ce614c26dd667efa94b1662c7a2f7281bf8f
1 parent
26332265
Exists in
master
and in
23 other branches
Add has_many for qualifiers/certifiers
Refactor acts_as_searchable and acts_as_faceted for products
Showing
4 changed files
with
54 additions
and
31 deletions
Show diff stats
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 < 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 < 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 < 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 < 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 | ... | ... |