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
109 110 111 |
# File 'app/models/spree/zone.rb', line 109 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.
41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/spree/zone.rb', line 41 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
63 64 65 |
# File 'app/models/spree/zone.rb', line 63 def <=>(other) name <=> other.name end |
#contains?(target) ⇒ Boolean
Indicates whether the specified zone falls entirely within the zone performing the check.
115 116 117 118 119 120 121 122 123 124 125 |
# File 'app/models/spree/zone.rb', line 115 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.collect(&:id) - zoneables.collect(&:id)).present? else return false if (target.zoneables.collect(&:country).collect(&:id) - zoneables.collect(&:id)).present? end true end |
#country_ids ⇒ Object
73 74 75 76 77 78 79 |
# File 'app/models/spree/zone.rb', line 73 def country_ids if kind == 'country' members.pluck(:zoneable_id) else [] end end |
#country_ids=(ids) ⇒ Object
89 90 91 92 93 94 95 96 97 |
# File 'app/models/spree/zone.rb', line 89 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
55 56 57 58 59 60 61 |
# File 'app/models/spree/zone.rb', line 55 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
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'app/models/spree/zone.rb', line 24 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
14 15 16 17 18 |
# File 'app/models/spree/zone.rb', line 14 def kind if members.any? && !members.any? { |member| member.try(:zoneable_type).nil? } members.last.zoneable_type.demodulize.underscore end end |
#kind=(value) ⇒ Object
20 21 22 |
# File 'app/models/spree/zone.rb', line 20 def kind=(value) # do nothing - just here to satisfy the form end |
#state_ids ⇒ Object
81 82 83 84 85 86 87 |
# File 'app/models/spree/zone.rb', line 81 def state_ids if kind == 'state' members.pluck(:zoneable_id) else [] end end |
#state_ids=(ids) ⇒ Object
99 100 101 102 103 104 105 106 107 |
# File 'app/models/spree/zone.rb', line 99 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.
69 70 71 |
# File 'app/models/spree/zone.rb', line 69 def zoneables members.includes(:zoneable).collect(&:zoneable) end |