Class: Spree::Address

Inherits:
Base
  • Object
show all
Defined in:
app/models/spree/address.rb

Constant Summary collapse

DB_ONLY_ATTRS =
%w(id updated_at created_at)

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#initialize_preference_defaults, page, preference

Methods included from Preferences::Preferable

#default_preferences, #defined_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_type, #set_preference

Class Method Details

.build_defaultObject



25
26
27
# File 'app/models/spree/address.rb', line 25

def self.build_default
  new(country: Spree::Country.default)
end

.default(user = nil, kind = "bill") ⇒ Object



29
30
31
32
33
34
35
36
# File 'app/models/spree/address.rb', line 29

def self.default(user = nil, kind = "bill")
  ActiveSupport::Deprecation.warn("Address.default is deprecated. Use User.default_address or Address.build_default", caller)
  if user
    user.send(:"#{kind}_address") || build_default
  else
    build_default
  end
end

.factory(attributes) ⇒ Address



39
40
41
42
# File 'app/models/spree/address.rb', line 39

def self.factory(attributes)
  full_attributes = value_attributes(column_defaults, new(attributes).attributes)
  find_or_initialize_by(full_attributes)
end

.immutable_merge(existing_address, new_attributes) ⇒ Address

@note, this may return existing_address if there are no changes to value equality



46
47
48
49
50
51
52
53
54
55
56
# File 'app/models/spree/address.rb', line 46

def self.immutable_merge(existing_address, new_attributes)
  return factory(new_attributes) if existing_address.nil?

  merged_attributes = value_attributes(existing_address.attributes, new_attributes)
  new_address = factory(merged_attributes)
  if existing_address == new_address
    existing_address
  else
    new_address
  end
end

.value_attributes(base_attributes, merge_attributes = nil) ⇒ Hash



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/models/spree/address.rb', line 59

def self.value_attributes(base_attributes, merge_attributes = nil)
  # dup because we may modify firstname/lastname.
  base = base_attributes.dup

  base.stringify_keys!

  if merge_attributes
    base.merge!(merge_attributes.stringify_keys)
  end

  # TODO: Deprecate these aliased attributes
  base['firstname'] = base.delete('first_name') if base.key?('first_name')
  base['lastname'] = base.delete('last_name') if base.key?('last_name')

  base.except!(*DB_ONLY_ATTRS)
end

Instance Method Details

#==(other_address) ⇒ Boolean

Note:

This compares the addresses based on only the fields that make up the logical “address” and excludes the database specific fields (id, created_at, updated_at).

Returns true if the two addresses have the same address fields.



98
99
100
101
# File 'app/models/spree/address.rb', line 98

def ==(other_address)
  return false unless other_address && other_address.respond_to?(:value_attributes)
  value_attributes == other_address.value_attributes
end

#active_merchant_hashHash



118
119
120
121
122
123
124
125
126
127
128
129
# File 'app/models/spree/address.rb', line 118

def active_merchant_hash
  {
    name: full_name,
    address1: address1,
    address2: address2,
    city: city,
    state: state_text,
    zip: zipcode,
    country: country.try(:iso),
    phone: phone
  }
end

#country_iso=(iso) ⇒ Country

Returns setter that sets self.country to the Country with a matching 2 letter iso.

Raises:

  • (ActiveRecord::RecordNotFound)

    if country with the iso doesn’t exist



154
155
156
# File 'app/models/spree/address.rb', line 154

def country_iso=(iso)
  self.country = Country.find_by!(iso: iso)
end

#empty?Boolean



113
114
115
# File 'app/models/spree/address.rb', line 113

def empty?
  attributes.except('id', 'created_at', 'updated_at', 'country_id').all? { |_, v| v.nil? }
end

#full_nameString



82
83
84
# File 'app/models/spree/address.rb', line 82

def full_name
  "#{firstname} #{lastname}".strip
end

#readonly?Boolean

This is set in order to preserve immutability of Addresses. Use #dup to create new records as required, but it probably won’t be required as often as you think. Since addresses do not change, you won’t accidentally alter historical data.



147
148
149
# File 'app/models/spree/address.rb', line 147

def readonly?
  persisted?
end

#require_phone?true



134
135
136
# File 'app/models/spree/address.rb', line 134

def require_phone?
  true
end

#require_zipcode?true



140
141
142
# File 'app/models/spree/address.rb', line 140

def require_zipcode?
  true
end

#same_as(other_address) ⇒ Object



108
109
110
111
# File 'app/models/spree/address.rb', line 108

def same_as(other_address)
  ActiveSupport::Deprecation.warn("Address.same_as is deprecated. It's equivalent to Address.==", caller)
  self == other_address
end

#same_as?(other_address) ⇒ Boolean



103
104
105
106
# File 'app/models/spree/address.rb', line 103

def same_as?(other_address)
  ActiveSupport::Deprecation.warn("Address.same_as? is deprecated. It's equivalent to Address.==", caller)
  self == other_address
end

#state_textString



87
88
89
# File 'app/models/spree/address.rb', line 87

def state_text
  state.try(:abbr) || state.try(:name) || state_name
end

#to_sObject



91
92
93
# File 'app/models/spree/address.rb', line 91

def to_s
  "#{full_name}: #{address1}"
end

#value_attributesHash



77
78
79
# File 'app/models/spree/address.rb', line 77

def value_attributes
  self.class.value_attributes(attributes)
end