Module: Globalize::ActiveRecord::InstanceMethods
- Defined in:
- lib/globalize/active_record/instance_methods.rb
Instance Method Summary collapse
- #assign_attributes(attributes, *args) ⇒ Object
- #attribute_names ⇒ Object
- #attributes ⇒ Object
- #attributes=(attributes, *args) ⇒ Object
-
#available_locales ⇒ Object
Get available locales from translations association, without a separate distinct query.
- #cache_key ⇒ Object
- #column_for_attribute(name) ⇒ Object
- #globalize ⇒ Object
- #globalize_fallbacks(locale) ⇒ Object
- #initialize_dup(other) ⇒ Object
- #read_attribute(name, options = {}) ⇒ Object
- #reload(options = nil) ⇒ Object
- #rollback ⇒ Object
- #save ⇒ Object
- #set_translations(options) ⇒ Object
- #translated_attribute_by_locale(name) ⇒ Object
- #translated_attributes ⇒ Object
- #translation ⇒ Object
- #translation_caches ⇒ Object
- #translation_for(locale, build_if_missing = true) ⇒ Object
- #translations_by_locale ⇒ Object
-
#untranslated_attributes ⇒ Object
This method is basically the method built into Rails but we have to pass => false.
- #write_attribute(name, value, options = {}) ⇒ Object
Instance Method Details
#assign_attributes(attributes, *args) ⇒ Object
18 19 20 |
# File 'lib/globalize/active_record/instance_methods.rb', line 18 def assign_attributes(attributes, *args) with_given_locale(attributes) { super } end |
#attribute_names ⇒ Object
59 60 61 |
# File 'lib/globalize/active_record/instance_methods.rb', line 59 def attribute_names translated_attribute_names.map(&:to_s) + super end |
#attributes ⇒ Object
10 11 12 |
# File 'lib/globalize/active_record/instance_methods.rb', line 10 def attributes super.merge(translated_attributes) end |
#attributes=(attributes, *args) ⇒ Object
14 15 16 |
# File 'lib/globalize/active_record/instance_methods.rb', line 14 def attributes=(attributes, *args) with_given_locale(attributes) { super } end |
#available_locales ⇒ Object
Get available locales from translations association, without a separate distinct query
138 139 140 |
# File 'lib/globalize/active_record/instance_methods.rb', line 138 def available_locales translations.map(&:locale).uniq end |
#cache_key ⇒ Object
162 163 164 |
# File 'lib/globalize/active_record/instance_methods.rb', line 162 def cache_key [super, translation.cache_key].join("/") end |
#column_for_attribute(name) ⇒ Object
156 157 158 159 160 |
# File 'lib/globalize/active_record/instance_methods.rb', line 156 def column_for_attribute name return super if translated_attribute_names.exclude?(name) globalize.send(:column_for_attribute, name) end |
#globalize ⇒ Object
6 7 8 |
# File 'lib/globalize/active_record/instance_methods.rb', line 6 def globalize @globalize ||= Adapter.new(self) end |
#globalize_fallbacks(locale) ⇒ Object
142 143 144 |
# File 'lib/globalize/active_record/instance_methods.rb', line 142 def globalize_fallbacks(locale) Globalize.fallbacks(locale) end |
#initialize_dup(other) ⇒ Object
99 100 101 102 103 104 105 106 |
# File 'lib/globalize/active_record/instance_methods.rb', line 99 def initialize_dup(other) @globalize = nil @translation_caches = nil super other.each_locale_and_translated_attribute do |locale, name| globalize.write(locale, name, other.globalize.fetch(locale, name) ) end end |
#read_attribute(name, options = {}) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/globalize/active_record/instance_methods.rb', line 44 def read_attribute(name, = {}) = {:translated => true, :locale => nil}.merge() return super(name) unless [:translated] if translated?(name) if (value = globalize.fetch([:locale] || Globalize.locale, name)) value else super(name) end else super(name) end end |
#reload(options = nil) ⇒ Object
92 93 94 95 96 97 |
# File 'lib/globalize/active_record/instance_methods.rb', line 92 def reload( = nil) translation_caches.clear translated_attribute_names.each { |name| @attributes.reset(name.to_s) } globalize.reset super() end |
#rollback ⇒ Object
146 147 148 |
# File 'lib/globalize/active_record/instance_methods.rb', line 146 def rollback translation_caches[::Globalize.locale] = translation.previous_version end |
#save ⇒ Object
150 151 152 153 154 |
# File 'lib/globalize/active_record/instance_methods.rb', line 150 def save(*) Globalize.with_locale(translation.locale || I18n.default_locale) do super end end |
#set_translations(options) ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/globalize/active_record/instance_methods.rb', line 79 def set_translations() .keys.each do |locale| translation = translation_for(locale) || translations.build(:locale => locale.to_s) [locale].each do |key, value| translation.send :"#{key}=", value end translation.save end globalize.reset end |
#translated_attribute_by_locale(name) ⇒ Object
133 134 135 |
# File 'lib/globalize/active_record/instance_methods.rb', line 133 def translated_attribute_by_locale(name) translations_by_locale(&:"#{name}") end |
#translated_attributes ⇒ Object
65 66 67 68 69 |
# File 'lib/globalize/active_record/instance_methods.rb', line 65 def translated_attributes translated_attribute_names.inject({}) do |attributes, name| attributes.merge(name.to_s => send(name)) end end |
#translation ⇒ Object
108 109 110 |
# File 'lib/globalize/active_record/instance_methods.rb', line 108 def translation translation_for(::Globalize.locale) end |
#translation_caches ⇒ Object
123 124 125 |
# File 'lib/globalize/active_record/instance_methods.rb', line 123 def translation_caches @translation_caches ||= {} end |
#translation_for(locale, build_if_missing = true) ⇒ Object
112 113 114 115 116 117 118 119 120 121 |
# File 'lib/globalize/active_record/instance_methods.rb', line 112 def translation_for(locale, build_if_missing = true) unless translation_caches[locale] # Fetch translations from database as those in the translation collection may be incomplete _translation = translations.detect{|t| t.locale.to_s == locale.to_s} _translation ||= translations.with_locale(locale).first unless translations.loaded? _translation ||= translations.build(:locale => locale) if build_if_missing translation_caches[locale] = _translation if _translation end translation_caches[locale] end |
#translations_by_locale ⇒ Object
127 128 129 130 131 |
# File 'lib/globalize/active_record/instance_methods.rb', line 127 def translations_by_locale translations.each_with_object(HashWithIndifferentAccess.new) do |t, hash| hash[t.locale] = block_given? ? yield(t) : t end end |
#untranslated_attributes ⇒ Object
This method is basically the method built into Rails but we have to pass => false
73 74 75 76 77 |
# File 'lib/globalize/active_record/instance_methods.rb', line 73 def untranslated_attributes attribute_names.inject({}) do |attrs, name| attrs[name] = read_attribute(name, {:translated => false}); attrs end end |
#write_attribute(name, value, options = {}) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/globalize/active_record/instance_methods.rb', line 22 def write_attribute(name, value, = {}) return super(name, value) unless translated?(name) = {:locale => Globalize.locale}.merge() # Dirty tracking, paraphrased from # ActiveRecord::AttributeMethods::Dirty#write_attribute. name_str = name.to_s if attribute_changed?(name_str) # If there's already a change, delete it if this undoes the change. old = changed_attributes[name_str] @changed_attributes.delete(name_str) if value == old else # If there's not a change yet, record it. old = globalize.fetch([:locale], name) old = old.dup if old.duplicable? @changed_attributes[name_str] = old if value != old end globalize.write([:locale], name, value) end |