Class: Spree::Zone
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Spree::Zone
- Defined in:
- app/models/spree/zone.rb
Class Method Summary collapse
- .default_tax ⇒ Object
-
.match(address) ⇒ Object
Returns the matching zone with the highest priority zone type (State, Country, Zone.) Returns nil in the case of no matches.
Instance Method Summary collapse
- #<=>(other) ⇒ Object
-
#contains?(target) ⇒ Boolean
Indicates whether the specified zone falls entirely within the zone performing the check.
-
#country_list ⇒ Object
convenience method for returning the countries contained within a zone.
- #include?(address) ⇒ Boolean
- #kind ⇒ Object
- #kind=(value) ⇒ Object
-
#zoneables ⇒ Object
All zoneables belonging to the zone members.
Class Method Details
.default_tax ⇒ Object
76 77 78 |
# File 'app/models/spree/zone.rb', line 76 def self.default_tax where(default_tax: true).first end |
.match(address) ⇒ Object
Returns the matching zone with the highest priority zone type (State, Country, Zone.) Returns nil in the case of no matches.
44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'app/models/spree/zone.rb', line 44 def self.match(address) return unless matches = self.includes(:zone_members). order('zone_members_count', 'created_at'). select { |zone| zone.include? address } ['state', 'country'].each do |zone_kind| if match = matches.detect { |zone| zone_kind == zone.kind } return match end end matches.first end |
Instance Method Details
#<=>(other) ⇒ Object
66 67 68 |
# File 'app/models/spree/zone.rb', line 66 def <=>(other) name <=> other.name end |
#contains?(target) ⇒ Boolean
Indicates whether the specified zone falls entirely within the zone performing the check.
82 83 84 85 86 87 88 89 90 91 92 |
# File 'app/models/spree/zone.rb', line 82 def contains?(target) return false if kind == 'state' && target.kind == 'country' return false if zone_members.empty? || target.zone_members.empty? if kind == target.kind return false if target.zoneables.any? { |target_zoneable| zoneables.exclude?(target_zoneable) } else return false if target.zoneables.any? { |target_state| zoneables.exclude?(target_state.country) } end true end |
#country_list ⇒ Object
convenience method for returning the countries contained within a zone
58 59 60 61 62 63 64 |
# File 'app/models/spree/zone.rb', line 58 def country_list @countries ||= case kind when 'country' then zoneables when 'state' then zoneables.collect(&:country) else nil end.flatten.compact.uniq end |
#include?(address) ⇒ Boolean
27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'app/models/spree/zone.rb', line 27 def include?(address) return false unless address members.any? do |zone_member| case zone_member.zoneable_type when 'Spree::Country' zone_member.zoneable_id == address.country_id when 'Spree::State' zone_member.zoneable_id == address.state_id else false end end end |
#kind ⇒ Object
17 18 19 20 21 |
# File 'app/models/spree/zone.rb', line 17 def kind if members.any? && !members.any? { |member| member.try(:zoneable_type).nil? } members.last.zoneable_type.demodulize.downcase end end |
#kind=(value) ⇒ Object
23 24 25 |
# File 'app/models/spree/zone.rb', line 23 def kind=(value) # do nothing - just here to satisfy the form end |
#zoneables ⇒ Object
All zoneables belonging to the zone members. Will be a collection of either countries or states depending on the zone type.
72 73 74 |
# File 'app/models/spree/zone.rb', line 72 def zoneables members.collect(&:zoneable) end |