Module: Countrizable::ActiveRecord::InstanceMethods
- Defined in:
- lib/countrizable/active_record/instance_methods.rb
Instance Method Summary collapse
- #[](attr_name) ⇒ Object
-
#_assign_attributes(new_attributes) ⇒ Object
In Rails 5.2 we need to override _assign_attributes as it’s called earlier in the stack (before assign_attributes) See github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment.rb#L11.
- #_read_attribute(attr_name, options = {}, &block) ⇒ Object
- #assign_attributes(new_attributes, *options) ⇒ Object
- #attribute_names ⇒ Object
- #attributes ⇒ Object
- #attributes=(new_attributes, *options) ⇒ Object
-
#available_country_codes ⇒ Object
Get available country_codes from country_value association, without a separate distinct query.
- #cache_key ⇒ Object
- #changed? ⇒ Boolean
- #column_for_attribute(name) ⇒ Object
- #countrizable ⇒ Object
- #countrizable_fallbacks(country_code) ⇒ Object
- #country_attribute_by_country_code(name) ⇒ Object
- #country_attributed_attributes ⇒ Object
- #country_value ⇒ Object
- #country_value_caches ⇒ Object
- #country_value_for(country_code, build_if_missing = true) ⇒ Object
- #country_values_by_country_code ⇒ Object
- #initialize_dup(other) ⇒ Object
-
#original_changed_attributes ⇒ Object
need to access instance variable directly since changed_attributes is frozen as of Rails 4.2.
- #read_attribute(attr_name, options = {}, &block) ⇒ Object
- #reload(options = nil) ⇒ Object
- #save ⇒ Object
- #set_country_values(options) ⇒ Object
-
#uncountry_attributes ⇒ Object
This method is basically the method built into Rails but we have to pass => false.
- #write_attribute(name, value, *args, &block) ⇒ Object
Instance Method Details
#[](attr_name) ⇒ Object
48 49 50 51 52 53 54 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 48 def [](attr_name) if country_attributed?(attr_name) read_attribute(attr_name) else read_attribute(attr_name) { |n| missing_attribute(n, caller) } end end |
#_assign_attributes(new_attributes) ⇒ Object
In Rails 5.2 we need to override _assign_attributes as it’s called earlier in the stack (before assign_attributes) See github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment.rb#L11
25 26 27 28 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 25 def _assign_attributes(new_attributes) attributes = new_attributes.stringify_keys with_given_country_code(attributes) { super(attributes.except("country_code")) } end |
#_read_attribute(attr_name, options = {}, &block) ⇒ Object
68 69 70 71 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 68 def _read_attribute(attr_name, = {}, &block) country_value = read_country_attribute(attr_name, , &block) country_value.nil? ? super(attr_name, &block) : country_value end |
#assign_attributes(new_attributes, *options) ⇒ Object
32 33 34 35 36 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 32 def assign_attributes(new_attributes, *) super unless new_attributes.respond_to?(:stringify_keys) && new_attributes.present? attributes = new_attributes.stringify_keys with_given_country_code(attributes) { super(attributes.except("country_code"), *) } end |
#attribute_names ⇒ Object
73 74 75 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 73 def attribute_names country_attribute_names.map(&:to_s) + super end |
#attributes ⇒ Object
10 11 12 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 10 def attributes super.merge(country_attributed_attributes) end |
#attributes=(new_attributes, *options) ⇒ Object
14 15 16 17 18 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 14 def attributes=(new_attributes, *) super unless new_attributes.respond_to?(:stringify_keys) && new_attributes.present? attributes = new_attributes.stringify_keys with_given_country_code(attributes) { super(attributes.except("country_code"), *) } end |
#available_country_codes ⇒ Object
Get available country_codes from country_value association, without a separate distinct query
153 154 155 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 153 def available_country_codes country_values.map(&:country_code).uniq end |
#cache_key ⇒ Object
180 181 182 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 180 def cache_key [super, country_value.cache_key].join("/") end |
#changed? ⇒ Boolean
184 185 186 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 184 def changed? changed_attributes.present? || country_values.any?(&:changed?) end |
#column_for_attribute(name) ⇒ Object
174 175 176 177 178 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 174 def column_for_attribute name return super if country_attribute_names.exclude?(name) countrizable.send(:column_for_attribute, name) end |
#countrizable ⇒ Object
6 7 8 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 6 def countrizable @countrizable ||= Adapter.new(self) end |
#countrizable_fallbacks(country_code) ⇒ Object
157 158 159 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 157 def countrizable_fallbacks(country_code) Countrizable.fallbacks(country_code) end |
#country_attribute_by_country_code(name) ⇒ Object
148 149 150 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 148 def country_attribute_by_country_code(name) country_values_by_country_code(&:"#{name}") end |
#country_attributed_attributes ⇒ Object
79 80 81 82 83 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 79 def country_attributed_attributes country_attribute_names.inject({}) do |attributes, name| attributes.merge(name.to_s => send(name)) end end |
#country_value ⇒ Object
123 124 125 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 123 def country_value country_value_for(::Countrizable.country_code) end |
#country_value_caches ⇒ Object
138 139 140 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 138 def country_value_caches @country_value_caches ||= {} end |
#country_value_for(country_code, build_if_missing = true) ⇒ Object
127 128 129 130 131 132 133 134 135 136 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 127 def country_value_for(country_code, build_if_missing = true) unless country_value_caches[country_code] # Fetch values from database as those in the country values collection may be incomplete _country_value = country_values.detect{|t| t.country_code.to_s == country_code.to_s} _country_value ||= country_values.with_country_code(country_code).first unless country_values.loaded? _country_value ||= country_values.build(:country_code => country_code) if build_if_missing country_value_caches[country_code] = _country_value if _country_value end country_value_caches[country_code] end |
#country_values_by_country_code ⇒ Object
142 143 144 145 146 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 142 def country_values_by_country_code country_values.each_with_object(HashWithIndifferentAccess.new) do |t, hash| hash[t.country_code] = block_given? ? yield(t) : t end end |
#initialize_dup(other) ⇒ Object
114 115 116 117 118 119 120 121 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 114 def initialize_dup(other) @countrizable = nil @country_value_caches = nil super other.each_country_code_and_country_attribute do |country_code, name| countrizable.write(country_code, name, other.countrizable.fetch(country_code, name) ) end end |
#original_changed_attributes ⇒ Object
need to access instance variable directly since changed_attributes is frozen as of Rails 4.2
190 191 192 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 190 def original_changed_attributes @changed_attributes end |
#read_attribute(attr_name, options = {}, &block) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 56 def read_attribute(attr_name, = {}, &block) name = if self.class.attribute_alias?(attr_name) self.class.attribute_alias(attr_name).to_s else attr_name.to_s end name = self.class.primary_key if name == "id".freeze && self.class.primary_key _read_attribute(name, , &block) end |
#reload(options = nil) ⇒ Object
107 108 109 110 111 112 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 107 def reload( = nil) country_value_caches.clear country_attribute_names.each { |name| @attributes.reset(name.to_s) } countrizable.reset super() end |
#save ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 161 def save(*) result = Countrizable.with_country_code(country_value.country_code || I18n.default_country_code) do without_fallbacks do super end end if result countrizable.clear_dirty end result end |
#set_country_values(options) ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 93 def set_country_values() .keys.each do |country_code| country_value = country_value_for(country_code) || country_values.build(:country_code => country_code.to_s) [country_code].each do |key, value| country_value.send :"#{key}=", value country_value.countrizable_model.send :"#{key}=", value end country_value.save if persisted? end countrizable.reset end |
#uncountry_attributes ⇒ Object
This method is basically the method built into Rails but we have to pass => false
87 88 89 90 91 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 87 def uncountry_attributes attribute_names.inject({}) do |attrs, name| attrs[name] = read_attribute(name, {:country_attributed => false}); attrs end end |
#write_attribute(name, value, *args, &block) ⇒ Object
40 41 42 43 44 45 46 |
# File 'lib/countrizable/active_record/instance_methods.rb', line 40 def write_attribute(name, value, *args, &block) return super(name, value, *args, &block) unless country_attributed?(name) = {:country_code => Countrizable.country_code}.merge(args.first || {}) countrizable.write([:country_code], name, value) end |