localizable_db 1.0.9 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 917295631d33c010de7203976ccaeb7a2ae5e9c0a202f7706c16f9bb336963bc
4
- data.tar.gz: 43dbea407d477a837c10e763df32ce4e842e540427398d9f3cc264ce16b267d8
3
+ metadata.gz: 3a99073b188d1f8dca333d7d3f44e6ac410bfa910b2cfb599a295a560ae1253f
4
+ data.tar.gz: bd9fef76db1684201bf7a886be643fd7978d584302b524fdaded7f2a76a38a8b
5
5
  SHA512:
6
- metadata.gz: acd94c123f9ddb1c24abeacf2d2a08c5d83bb6fcce4e9a0f4211ff2498526145cc4360956c18994acc4ddca9f55c396daf91bd6605a82e22988409cec2b6b6b6
7
- data.tar.gz: 8c4162534f685f2d9009064b866ba79f0906449982bbadd77d4e23e0641165a955f63c9774ca213b1f5ba2b19b1181cc51dc37536e329f9c9c3ad3570e155372
6
+ metadata.gz: 342b8a4fed0728288bc2efbd50f9bf1d9bf14916f5ed9221f31f5c41ebf110d32c204399f85add85760792f85cea3caeacd4ab1b1cd23da1d35fd63456439a3a
7
+ data.tar.gz: 7c0d50374228b52e77278fc867ee68fa56da487428ae637966197b8113d04fc0ee7496cfd520c53bd3b67a576f5536a090530e0eaab693cb142b2646de4ca118
data/README.md CHANGED
@@ -13,6 +13,10 @@ Product.where(id: 1)
13
13
 
14
14
  I18n.locale = :es
15
15
 
16
+ Product.find(1) #=> <Product id: 1, name: "suerte">
17
+ Product.where(id: 1)
18
+ #=> <ActiveRecord::Relation [#<Product id: 1, name: "suerte">]>
19
+
16
20
  Product.l.find(1) #=> <Product id: 1, name: "suerte">
17
21
  Product.l.where(id: 1)
18
22
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "suerte">]>
@@ -26,17 +30,14 @@ Product.where(id: 1)
26
30
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "luck">]>
27
31
 
28
32
  Product.l(:es).find(1) #=> <Product id: 1, name: "suerte">
29
- Product.find(1).l(:es) #=> <Product id: 1, name: "suerte">
30
33
  Product.l(:es).where(id: 1)
31
34
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "suerte">]>
32
35
 
33
36
  Product.l(:pt).find(1) #=> <Product id: 1, name: "sortudo">
34
- Product.find(1).l(:pt) #=> <Product id: 1, name: "sortudo">
35
37
  Product.l(:pt).where(id: 1)
36
38
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "sortudo">]>
37
39
 
38
40
  Product.l(:fr).find(1) #=> <Product id: 1, name: "heureux">
39
- Product.find(1).l(:fr) #=> <Product id: 1, name: "heureux">
40
41
  Product.l(:fr).where(id: 1)
41
42
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "heureux">]>
42
43
  ````
@@ -45,39 +46,43 @@ Localize multiple languages
45
46
  products = Product.where(id: 1)
46
47
  products.inspect
47
48
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "luck">]>
48
- products = Product.wl(:es,:pt,:fr).where(id: 1)
49
+ products = Product.l(:es,:pt,:fr).where(id: 1)
49
50
  products.inspect
50
51
  #=> <ActiveRecord::Relation [#<Product id: 1, name: "luck", es_name: "suerte", pt_name: "sortudo", fr_name: "heureux">]>
51
52
 
52
53
  products.first.name #=> luck
54
+ products.first.get_name #=> luck
55
+ products.first.get_name(:es) #=> suerte
56
+ products.first.get_name(:pt) #=> sortudo
57
+ products.first.get_name(:fr) #=> heureux
53
58
  products.first.attributes["es_name"] #=> suerte
54
59
  products.first.attributes["pt_name"] #=> sortudo
55
60
  products.first.attributes["fr_name"] #=> heureux
56
61
  ````
57
62
  Creating
58
63
  ````ruby
59
- Product.create(name: "something", languages: {
60
- es: {name: "algo"},
61
- pt: {name: "alguma cosia"},
62
- fr: {name: "quelque chose"}
63
- })
64
+ Product.create(name: "something", product_languages_attributes: [{
65
+ {name: "algo", locale: "es"},
66
+ {name: "alguma cosia", locale: "pt"},
67
+ {name: "quelque chose", locale: "fr"}
68
+ }])
64
69
  #=> #<Product id:2, name: "something">
65
70
  ````
66
71
  Saving
67
72
  ````ruby
68
- Product.new(name: "love", languages: {
69
- es: {name: "amor"},
70
- pt: {name: "amor"},
71
- fr: {name: "amour"}
72
- }).save
73
+ Product.new(name: "love", product_languages_attributes: [{
74
+ {name: "algo", locale: "es"},
75
+ {name: "alguma cosia", locale: "pt"},
76
+ {name: "quelque chose", locale: "fr"}
77
+ }]).save
73
78
  #=> #<Product id:3, name: "love">
74
79
 
75
80
  love = Product.last
76
- love.set_languages({
77
- es: {name: "amor :D"},
78
- pt: {name: "amor :D"},
79
- fr: {name: "amouuurt"}
80
- })
81
+ love.product_languages.build([
82
+ {name: "algo", locale: "es"},
83
+ {name: "alguma cosia", locale: "pt"},
84
+ {name: "quelque chose", locale: "fr"}
85
+ ])
81
86
  love.save
82
87
  #=> #<Product id: 3, name: "love">
83
88
  love = Product.l(:fr).find(3)
@@ -87,11 +92,11 @@ love.inspect
87
92
  Updating
88
93
  ````ruby
89
94
  product = Product.find(3)
90
- product.update(name: "the love", languages: {
91
- es: {name: "el amor"},
92
- pt: {name: "o amor"},
93
- fr: {name: "l'amour"}
94
- })
95
+ product.update(name: "the love", product_languages_attributes: [{
96
+ {name: "algo", locale: "es"},
97
+ {name: "alguma cosia", locale: "pt"},
98
+ {name: "quelque chose", locale: "fr"}
99
+ }])
95
100
  #=> #<Product id:3, name: "the love">
96
101
 
97
102
  product = Product.l(:fr).find(3)
@@ -113,9 +118,7 @@ products = Product.includes(:features).where(id: 1)
113
118
  products.first.features.inspect
114
119
  #=> <ActiveRecord::Relation [#<Feature id: 1, desc: "Makes people happy">]>
115
120
 
116
- products = Product.l(:es) do |products|
117
- products.includes(:features)
118
- end.where(id: 1)
121
+ products = Product.l(:es).includes.where(id: 1)
119
122
  products.first.features.inspect
120
123
  #=> <ActiveRecord::Relation [#<Feature id: 1, desc: "Hace a la gente feliz">]>
121
124
  ````
@@ -125,15 +128,18 @@ products = Product.includes(:features).where(id: 1)
125
128
  products.first.features.inspect
126
129
  #=> <ActiveRecord::Relation [#<Feature id: 1, desc: "Makes people happy">]>
127
130
 
128
- products = Product.wl(:es,:pt,:fr) do |products|
129
- products.includes(:features)
130
- end.where(id: 1)
131
+ products = Product.l(:es,:pt,:fr).includes(:features).where(id: 1)
131
132
  products.first.features.inspect
132
133
  #=> <ActiveRecord::Relation [#<Feature id: 1, desc: "Makes people happy", es_desc: "Hace a la gente feliz", pt_desc: "Faz as pessoas felizes", fr_desc: "Rend les gens heureux">]>
133
134
  ````
134
- #### NOTE:
135
- If you need to use aggregation functions or grouping stuff, use the raw model without calling the localize method (.l), otherwise a syntax error will be raised from ActiveRecord. We still working on this feature, if you want to help us, feel free to make a pull request :)
135
+ Aggregation and grouping stuff operations work as usual
136
+ ````ruby
137
+ Product.count
138
+ # => 3
136
139
 
140
+ Product.l(:es,:pt,:fr).count
141
+ # => 3
142
+ ````
137
143
  ## Installation
138
144
  Add this line to your application's Gemfile:
139
145
  ```ruby
@@ -150,14 +156,41 @@ Then Install it!
150
156
  $ rails g localizable_db:install
151
157
  ````
152
158
 
153
- Configure your supported languages
159
+ Configure your supported languages, default language and other the behavior of the gem.
154
160
  ````ruby
155
161
  # config/initializers/localizable_db_initializer_.rb
156
- module LocalizableDb
157
- module Languages
158
- DEFAULT = :en
159
- SUPPORTED = [:en, :es] #=> Add your locales to this array.
160
- end
162
+ LocalizableDb.config do |config|
163
+ # REQUIRED
164
+
165
+ config.supported_languages = [:en, :es, :pt, :fr]
166
+ config.default_language = :en
167
+
168
+ # OPTIONAL
169
+
170
+ # config.enable_i18n_integration = true
171
+ # enable_i18n_integration Allow you to use the eager load methods (includes, preload and eager_load)
172
+ # as in the examples. If you set this option to false then eager load methods will not work and
173
+ # you will have to call the ::l method to localize the language you want.
174
+
175
+ # config.enable_getters = true
176
+ # enable_getters Allow you to use the getters methods to access the localized attributes.
177
+
178
+ # config.attributes_integration = true
179
+ # attributes_integration overrides the attributes of the model with the localized attributes.
180
+ # Example:
181
+ # Imagine you have a Product like this one
182
+ # #<Product id: 1, name: "love">
183
+ # with this configuration
184
+ # Product < ApplicationRecord
185
+ # localize :name
186
+ # end
187
+ # When you retrieve the product of name love in spanish from your database, and this option is set to true
188
+ # it will return
189
+ # #<Product id: 1, name: "amor">
190
+ # If this option is set to false, the retrieved object will be
191
+ # #<Product id: 1, name: "love">
192
+ # an you will find the "es_name" into the #attributes hash
193
+
161
194
  end
162
195
  ````
163
196
 
@@ -1,6 +1,7 @@
1
- module LocalizableDb
2
- module Languages
3
- DEFAULT = :en
4
- SUPPORTED = [:en, :es]
5
- end
1
+ LocalizableDb.config do |config|
2
+ # config.supported_languages = [I18n.default_locale]
3
+ # config.default_language = I18n.default_locale
4
+ # config.enable_i18n_integration = true
5
+ # config.enable_getters = true
6
+ # config.attributes_integration = true
6
7
  end
@@ -0,0 +1,19 @@
1
+ module LocalizableDb
2
+ module Languages
3
+
4
+ def config
5
+ const_set("DEFAULT", LocalizableDb.configuration.default_language.to_sym || I18n.default_locale )
6
+ const_set(
7
+ "SUPPORTED",
8
+ (LocalizableDb.configuration.supported_languages.map do |language|
9
+ language.to_sym
10
+ end | [LocalizableDb.configuration.default_language.to_sym].flatten)
11
+ )
12
+ const_set(
13
+ "NOT_DEFAULT",
14
+ (SUPPORTED - [DEFAULT])
15
+ )
16
+ end
17
+ module_function :config
18
+ end
19
+ end
@@ -1,231 +1,164 @@
1
1
  module LocalizableDb
2
2
  module Localizable
3
3
  extend ActiveSupport::Concern
4
-
5
4
  included do
6
5
 
7
- def localize(language = nil)
8
- self.class.l(language).find_by_id(self.id)
6
+ def is_localizable?
7
+ self.class.is_localizable?
9
8
  end
10
9
 
11
- alias :l :localize
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ attr_accessor :is_localizable
12
15
 
13
- def with_languages(*languages)
14
- self.class.wl(languages).find_by_id(self.id)
16
+ def is_localizable?
17
+ self.is_localizable
15
18
  end
16
19
 
17
- alias :wl :with_languages
18
-
19
- def save_languages
20
- if !self._locale and self.languages
21
- self.languages.each do |language_key, language_values|
22
- self.class.table_name = self.class.localized_table_name
23
- aux_object = nil
24
- aux_object = self.class.find_by(locale: language_key.to_s, localizable_object_id: self.id) if self.id
25
- aux_object = self.class.new if !self.id or !aux_object
26
- aux_object.locale = language_key.to_s
27
- self.class.localized_attributes.each do |attribute|
28
- aux_object.send(:"#{attribute}=", language_values[attribute.to_sym])
29
- end
30
- aux_object.localizable_object_id = self.id
31
- not_localized_attributes = (self.attribute_names.map{|x| x.to_sym}-self.class.localized_attributes.map{|x| x.to_sym})
32
- not_localized_attributes.each do |attribute|
33
- aux_object.class_eval{ attr_accessor :"#{attribute}"}
34
- end
35
- aux_object._reflections.each do |reflection_key, reflection_value|
36
- if reflection_value.class == ActiveRecord::Reflection::BelongsToReflection
37
- not_localized_attributes << reflection_key.to_sym
38
- end
39
- end
40
- if !aux_object.valid?
41
- not_localized_attributes.each{|attribute| aux_object.errors.delete(attribute) }
42
- end
43
- aux_object.save(validate: false) if aux_object.errors.empty?
44
- not_localized_attributes.each do |attribute|
45
- aux_object.class_eval do
46
- undef :"#{attribute}"
47
- undef :"#{attribute}="
20
+ def localize(*localizable_attributes)
21
+ self.is_localizable = true
22
+ class_eval do
23
+ default_scope(if: LocalizableDb.configuration.enable_i18n_integration) do
24
+ localized
25
+ end
26
+ mattr_accessor :localized_table_name
27
+ mattr_accessor :normalized_table_name
28
+ mattr_accessor :localizable_attributes
29
+ end
30
+ self.localized_table_name = "#{self.table_name.singularize}_languages"
31
+ self.normalized_table_name = self.table_name
32
+ self.localizable_attributes = localizable_attributes
33
+ aux_localized_table_name = self.localized_table_name
34
+ aux_model_name = self.name
35
+ self.const_set("#{self.name}Language", Class.new(ApplicationRecord) do
36
+ self.table_name = aux_localized_table_name
37
+ belongs_to aux_model_name.downcase.to_sym,
38
+ class_name: aux_model_name,
39
+ foreign_key: "localizable_object_id",
40
+ inverse_of: aux_localized_table_name.to_sym
41
+ end)
42
+ class_eval do
43
+ has_many self.localized_table_name.to_sym,
44
+ class_name: "#{self.name}Language",
45
+ foreign_key: "localizable_object_id",
46
+ inverse_of: aux_model_name.downcase.to_sym,
47
+ dependent: :destroy
48
+
49
+ accepts_nested_attributes_for self.localized_table_name.to_sym
50
+ end
51
+ if LocalizableDb.configuration.enable_getters
52
+ self.localizable_attributes.each do |attribute|
53
+ class_eval %Q{
54
+ def get_#{attribute}(language = LocalizableDb::Languages::DEFAULT)
55
+ if language == LocalizableDb::Languages::DEFAULT
56
+ self.attributes["#{attribute.to_s}"]
57
+ else
58
+ self.attributes[language.to_s + "_#{attribute.to_s}"]
48
59
  end
49
60
  end
50
- aux_object.errors.messages.each do |err_key,err_message|
51
- self.errors.add("#{language_key}_#{err_key}", err_message)
52
- end if aux_object.errors.any?
53
- aux_object
61
+ }
54
62
  end
55
- self.class.table_name = self.class.name.pluralize.dasherize.downcase
56
- raise ActiveRecord::Rollback, "Languages error" if self.errors.any?
57
63
  end
58
- ensure
59
- self.class.table_name = self.class.name.pluralize.dasherize.downcase
60
- end
61
-
62
- end
63
-
64
- module ClassMethods
64
+ class << self
65
65
 
66
- def localize(*localizable_attributes)
67
- localizable_attributes.flatten!
68
- singularized_model_name = self.name.downcase.singularize.dasherize
69
- class_eval %Q{
70
-
71
- default_scope { localize_eager_load }
72
- default_scope { with_languages_eager_load }
73
-
74
- attr_accessor :languages, :_locale, :destroying_languages
75
-
76
- after_save :save_languages
77
- before_destroy do
78
- if self.class.table_name != self.class.localized_table_name
79
- self.destroying_languages = true
80
- self.class.table_name = self.class.localized_table_name
81
- self.class.where(localizable_object_id: self.id).destroy_all
82
- self.class.table_name = self.class.name.pluralize.dasherize
83
- end
84
- self.class.table_name = self.class.name.pluralize.dasherize.downcase if self.destroying_languages
85
- self.destroying_languages = false if self.destroying_languages
86
- ensure
87
- end
88
- after_commit do
89
- self.class.table_name = self.class.name.pluralize.dasherize.downcase
66
+ def get_locale
67
+ I18n.locale
90
68
  end
91
69
 
92
- after_rollback do
93
- self.class.table_name = self.class.name.pluralize.dasherize.downcase
70
+ def localized(*languages)
71
+ if(defined? LocalizableDb::Localizable and
72
+ ((LocalizableDb.configuration.enable_i18n_integration and self.get_locale != LocalizableDb::Languages::DEFAULT) or
73
+ (languages.any? and (languages-[LocalizableDb::Languages::DEFAULT]).any?)))
74
+ languages = LocalizableDb::Languages::SUPPORTED if(
75
+ languages.any? and languages.first == :all)
76
+ languages = [self.get_locale] if languages.empty? and LocalizableDb.configuration.enable_i18n_integration
77
+ languages.map!{|language| language.to_sym}
78
+ if languages.size == 1
79
+ language = languages.first
80
+ return one_language(language)
81
+ else
82
+ languages = languages.keep_if do |language|
83
+ LocalizableDb::Languages::NOT_DEFAULT.include? language
84
+ end
85
+ return multiple_languages(languages)
86
+ end
87
+ else
88
+ ActiveRecord::Relation.new(self, self.table_name,self.predicate_builder)
89
+ end
94
90
  end
95
91
 
96
- def set_languages(languages = {})
97
- self.languages = languages
98
- end
92
+ alias_method :l, :localized
99
93
 
100
94
  private
101
95
 
102
- def self.localized_table_name
103
- "#{singularized_model_name}_languages".freeze
96
+ def one_language(language)
97
+ attrs_to_select = single_languege_attrs_to_select_conf(language)
98
+ from("#{self.localized_table_name}").joins("
99
+ JOIN (
100
+ SELECT #{self.table_name}.id, #{attrs_to_select.join(',')}
101
+ FROM #{self.localized_table_name}, #{self.table_name}
102
+ WHERE #{self.localized_table_name}.locale = '#{language.to_s}'
103
+ AND #{self.localized_table_name}.localizable_object_id = #{self.table_name}.id
104
+ ) AS #{self.table_name}
105
+ ON #{self.localized_table_name}.locale = '#{language.to_s}'
106
+ AND #{self.localized_table_name}.localizable_object_id = #{self.table_name}.id
107
+ ")
104
108
  end
105
109
 
106
- def self.localized_attributes
107
- #{localizable_attributes}.map{|a| a.to_s}.freeze
108
- end
109
-
110
- def self.get_locale
111
- I18n.locale
112
- end
113
-
114
- }
115
-
116
- class << self
117
-
118
- def localized(language = nil)
119
- if defined? LocalizableDb::Localizable and
120
- (self.get_locale != I18n.default_locale or
121
- (language and language != I18n.default_locale))
122
-
123
- language = self.get_locale unless language
124
- raise "The locale :#{language} is not defined in the initialization file, please check config/initializers/localizable_db.rb to add it." if !LocalizableDb::Languages::SUPPORTED.include? language
125
- attrs_to_select = ""
126
- self.attribute_names.each do |attribute|
127
- attrs_to_select += "#{self.table_name}.#{attribute}"
128
- attrs_to_select += ", " if attribute != self.attribute_names.last
129
- end
130
- self.localized_attributes.each do |a|
131
- attrs_to_select += ", " if a == self.localized_attributes.first
132
- attrs_to_select += "#{self.localized_table_name}.#{a} as #{a}"
133
- attrs_to_select += ", " if a != self.localized_attributes.last
134
- end
135
- aux_select_values = joins("
136
- JOIN #{self.localized_table_name}
137
- ON locale = '#{language.to_s}'
138
- AND #{self.table_name}.id = #{self.localized_table_name}.localizable_object_id
139
- ").select_values.map{|select_value| select_value.to_s }.join(' ')
140
- localized_chain = (aux_select_values.scan(/#{self.localized_table_name}/).any? ? true : false)
141
- result = joins("
142
- JOIN #{self.localized_table_name}
143
- ON locale = '#{language.to_s}'
144
- AND #{self.table_name}.id = #{self.localized_table_name}.localizable_object_id
145
- ").select(attrs_to_select) if !localized_chain
146
- result = unscope(:joins, :select).joins("
147
- JOIN #{self.localized_table_name}
148
- ON locale = '#{language.to_s}'
149
- AND #{self.table_name}.id = #{self.localized_table_name}.localizable_object_id
150
- ").select(attrs_to_select) if localized_chain
151
- if block_given?
152
- ActiveRecord::Base._localized_eager_load = true
153
- result = yield(result).reload
154
- ActiveRecord::Base._localized_eager_load = false
155
- end
156
- result
157
- else
158
- return where(id: nil).unscope(where: :id)
110
+ def multiple_languages(languages)
111
+ attrs_to_select = (self.attribute_names).map do |attribute|
112
+ "#{self.table_name}.#{attribute.to_s}"
159
113
  end
160
- ensure
161
- ActiveRecord::Base._localized_eager_load = false
162
- end
163
-
164
- def with_languages(*with_languages)
165
- with_languages.flatten!
166
- with_languages = with_languages - [LocalizableDb::Languages::DEFAULT] if with_languages.any?
167
- with_languages = (LocalizableDb::Languages::SUPPORTED - [LocalizableDb::Languages::DEFAULT]) if with_languages.empty?
168
- attrs_to_select = "#{self.table_name}.*, "
169
- tables_to_select = "#{self.table_name}, "
114
+ tables_to_select = ""
170
115
  conditions_to_select = ""
171
- with_languages.each do |language|
172
- self.localized_attributes.each do |localized_attribute|
173
- attrs_to_select += "#{language.to_s}_#{self.localized_table_name}.#{localized_attribute} as #{language.to_s}_#{localized_attribute}"
174
- conditions_to_select += "#{language.to_s}_#{self.localized_table_name}.locale = '#{language.to_s}' AND "
175
- conditions_to_select += "#{language.to_s}_#{self.localized_table_name}.localizable_object_id = #{self.table_name}.id "
176
- attrs_to_select += ", " if localized_attribute != self.localized_attributes.last
177
- conditions_to_select += "AND " if language != with_languages.last or localized_attribute != self.localized_attributes.last
116
+ languages.each do |language|
117
+ attrs_to_select = attrs_to_select | self.localizable_attributes.map do |attribute|
118
+ "#{language.to_s}_#{self.localized_table_name}.#{attribute.to_s} as #{language.to_s}_#{attribute.to_s}"
178
119
  end
120
+ tables_to_select += "," if language != languages.first
179
121
  tables_to_select += "#{self.localized_table_name} as #{language.to_s}_#{self.localized_table_name}"
180
- attrs_to_select += ", " if language != with_languages.last
181
- tables_to_select += ", " if language != with_languages.last
182
- end
183
- result = unscope(:joins).unscope(:select)
184
- .select(attrs_to_select)
185
- .from(tables_to_select)
186
- .where(conditions_to_select)
187
- # result = unscope(:joins).joins("
188
- # JOIN #{self.localized_table_name}
189
- # ON locale IN (#{with_languages.map{|l| '"' + l.to_s + '"' }.join(', ')})
190
- # AND #{self.table_name}.id = #{self.localized_table_name}.localizable_object_id
191
- # ").select("products.*, product_languages.*")
192
- if block_given?
193
- ActiveRecord::Base._with_languages_eager_load = true
194
- result = yield(result).reload
195
- ActiveRecord::Base._with_languages_eager_load = false
122
+ conditions_to_select += "#{language.to_s}_#{self.localized_table_name}.locale = '#{language.to_s}'"
123
+ conditions_to_select += " AND #{language.to_s}_#{self.localized_table_name}.localizable_object_id = #{self.table_name}.id"
124
+ conditions_to_select += " AND " if language != languages.last
196
125
  end
197
- result
198
- ensure
199
- ActiveRecord::Base._with_languages_eager_load = false
126
+ from("#{tables_to_select}").joins("
127
+ JOIN (
128
+ SELECT #{self.table_name}.id, #{attrs_to_select.join(',')}
129
+ FROM #{self.table_name}, #{tables_to_select}
130
+ WHERE #{conditions_to_select}
131
+ ) AS #{self.table_name}
132
+ ON #{conditions_to_select}
133
+ ")
200
134
  end
201
135
 
202
- alias_method :l, :localized
203
- alias_method :localized, :l
204
- alias_method :wl, :with_languages
205
- alias_method :with_languages, :wl
206
-
207
- def localize_eager_load(language = nil)
208
- if ActiveRecord::Base._localized_eager_load
209
- l(language)
210
- else
211
- ActiveRecord::Relation.new(self, self.table_name,self.predicate_builder)
212
- end
213
- end
214
-
215
- def with_languages_eager_load(with_languages = [])
216
- if ActiveRecord::Base._with_languages_eager_load
217
- wl(with_languages)
136
+ def single_languege_attrs_to_select_conf(language = nil)
137
+ if LocalizableDb.configuration.attributes_integration
138
+ attrs_to_select = self.attribute_names - ["id"] - self.localizable_attributes.map do |attribute|
139
+ attribute.to_s
140
+ end
141
+ attrs_to_select = attrs_to_select | self.localizable_attributes.map do |attribute|
142
+ ["#{self.localized_table_name}.#{attribute.to_s}","#{self.localized_table_name}.#{attribute.to_s} as #{language}_#{attribute}"]
143
+ end
144
+ attrs_to_select.flatten!
218
145
  else
219
- ActiveRecord::Relation.new(self, self.table_name,self.predicate_builder)
146
+ attrs_to_select = self.attribute_names - ["id"]
147
+ attrs_to_select = attrs_to_select.map do |attribute|
148
+ "#{self.table_name}.#{attribute}"
149
+ end | self.localizable_attributes.map do |attribute|
150
+ "#{self.localized_table_name}.#{attribute.to_s} as #{language}_#{attribute}"
151
+ end
220
152
  end
153
+ attrs_to_select
221
154
  end
222
155
 
223
156
  end
224
- end
225
157
 
158
+ end
226
159
  end
227
160
  end
228
161
  end
229
162
 
163
+
230
164
  ActiveRecord::Base.send(:include, LocalizableDb::Localizable)
231
- ActiveRecord::Base.class_eval{ mattr_accessor :_localized_eager_load, :_with_languages_eager_load}
@@ -0,0 +1,32 @@
1
+ module LocalizableDb
2
+
3
+ mattr_accessor :configuration
4
+
5
+ def config
6
+ @@configuration ||= LocalizableConfig.new
7
+ yield(@@configuration) if block_given?
8
+ LocalizableDb::Languages.config if block_given?
9
+ @@configuration
10
+ end
11
+
12
+ module_function :config
13
+
14
+ private
15
+
16
+ class LocalizableConfig
17
+
18
+ attr_accessor :attributes_integration
19
+ attr_accessor :enable_getters
20
+ attr_accessor :enable_i18n_integration
21
+ attr_accessor :supported_languages
22
+ attr_accessor :default_language
23
+
24
+ def initialize()
25
+ @attributes_integration = true
26
+ @enable_getters = true
27
+ @enable_i18n_integration = true
28
+ @supported_languages = [I18n.default_locale]
29
+ @default_language = I18n.default_locale
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module LocalizableDb
2
- VERSION = '1.0.9'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -1,3 +1,5 @@
1
+ require 'localizable_db/languages'
2
+ require 'localizable_db/localizable_config'
1
3
  require 'localizable_db/localizable'
2
4
 
3
5
  module LocalizableDb
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: localizable_db
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yonga9121
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-02-13 00:00:00.000000000 Z
12
+ date: 2018-02-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -62,7 +62,9 @@ files:
62
62
  - lib/generators/localizable_db/templates/initializer.rb
63
63
  - lib/generators/localizable_db/templates/migration_for.rb
64
64
  - lib/localizable_db.rb
65
+ - lib/localizable_db/languages.rb
65
66
  - lib/localizable_db/localizable.rb
67
+ - lib/localizable_db/localizable_config.rb
66
68
  - lib/localizable_db/version.rb
67
69
  - lib/tasks/localizable_db_tasks.rake
68
70
  homepage: https://yonga9121.github.io/localizable_db