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_ids ⇒ Object
- #country_ids=(ids) ⇒ Object
-
#country_list ⇒ Object
convenience method for returning the countries contained within a zone.
- #include?(address) ⇒ Boolean
- #kind ⇒ Object
- #kind=(value) ⇒ Object
- #state_ids ⇒ Object
- #state_ids=(ids) ⇒ Object
-
#zoneables ⇒ Object
All zoneables belonging to the zone members.
Class Method Details
.default_tax ⇒ Object
114 115 116 |
# File 'app/models/spree/zone.rb', line 114 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.
46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'app/models/spree/zone.rb', line 46 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
68 69 70 |
# File 'app/models/spree/zone.rb', line 68 def <=>(other) name <=> other.name end |
#contains?(target) ⇒ Boolean
Indicates whether the specified zone falls entirely within the zone performing the check.
120 121 122 123 124 125 126 127 128 129 130 |
# File 'app/models/spree/zone.rb', line 120 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_ids ⇒ Object
78 79 80 81 82 83 84 |
# File 'app/models/spree/zone.rb', line 78 def country_ids if kind == 'country' members.collect(&:zoneable_id) else [] end end |
#country_ids=(ids) ⇒ Object
94 95 96 97 98 99 100 101 102 |
# File 'app/models/spree/zone.rb', line 94 def country_ids=(ids) zone_members.destroy_all ids.reject{ |id| id.blank? }.map do |id| member = ZoneMember.new member.zoneable_type = 'Spree::Country' member.zoneable_id = id members << member end end |
#country_list ⇒ Object
convenience method for returning the countries contained within a zone
60 61 62 63 64 65 66 |
# File 'app/models/spree/zone.rb', line 60 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
29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'app/models/spree/zone.rb', line 29 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
19 20 21 22 23 |
# File 'app/models/spree/zone.rb', line 19 def kind if members.any? && !members.any? { |member| member.try(:zoneable_type).nil? } members.last.zoneable_type.demodulize.underscore end end |
#kind=(value) ⇒ Object
25 26 27 |
# File 'app/models/spree/zone.rb', line 25 def kind=(value) # do nothing - just here to satisfy the form end |
#state_ids ⇒ Object
86 87 88 89 90 91 92 |
# File 'app/models/spree/zone.rb', line 86 def state_ids if kind == 'state' members.collect(&:zoneable_id) else [] end end |
#state_ids=(ids) ⇒ Object
104 105 106 107 108 109 110 111 112 |
# File 'app/models/spree/zone.rb', line 104 def state_ids=(ids) zone_members.destroy_all ids.reject{ |id| id.blank? }.map do |id| member = ZoneMember.new member.zoneable_type = 'Spree::State' member.zoneable_id = id members << member end end |
#zoneables ⇒ Object
All zoneables belonging to the zone members. Will be a collection of either countries or states depending on the zone type.
74 75 76 |
# File 'app/models/spree/zone.rb', line 74 def zoneables members.collect(&:zoneable) end |