mobility 0.7.6 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +14 -3
- data/Gemfile.lock +57 -0
- data/README.md +15 -4
- data/lib/mobility.rb +17 -1
- data/lib/mobility/active_record/uniqueness_validator.rb +1 -1
- data/lib/mobility/arel/nodes.rb +0 -3
- data/lib/mobility/arel/nodes/pg_ops.rb +0 -4
- data/lib/mobility/attributes.rb +42 -25
- data/lib/mobility/backends/active_record.rb +2 -2
- data/lib/mobility/backends/active_record/column.rb +2 -2
- data/lib/mobility/backends/active_record/key_value.rb +6 -9
- data/lib/mobility/backends/active_record/table.rb +6 -7
- data/lib/mobility/backends/column.rb +2 -2
- data/lib/mobility/backends/key_value.rb +5 -0
- data/lib/mobility/backends/sequel.rb +24 -11
- data/lib/mobility/backends/sequel/column.rb +4 -3
- data/lib/mobility/backends/sequel/container.rb +21 -12
- data/lib/mobility/backends/sequel/hstore.rb +11 -3
- data/lib/mobility/backends/sequel/json.rb +11 -3
- data/lib/mobility/backends/sequel/jsonb.rb +35 -3
- data/lib/mobility/backends/sequel/key_value.rb +97 -17
- data/lib/mobility/backends/sequel/serialized.rb +5 -4
- data/lib/mobility/backends/sequel/table.rb +95 -26
- data/lib/mobility/backends/table.rb +4 -0
- data/lib/mobility/configuration.rb +1 -1
- data/lib/mobility/plugins/active_record/query.rb +52 -26
- data/lib/mobility/plugins/locale_accessors.rb +3 -2
- data/lib/mobility/plugins/query.rb +3 -0
- data/lib/mobility/plugins/sequel/query.rb +140 -0
- data/lib/mobility/sequel.rb +0 -14
- data/lib/mobility/sequel/sql.rb +16 -0
- data/lib/mobility/version.rb +1 -1
- data/lib/rails/generators/mobility/templates/column_translations.rb +1 -1
- data/lib/rails/generators/mobility/templates/initializer.rb +3 -2
- data/lib/rails/generators/mobility/translations_generator.rb +1 -1
- metadata +27 -46
- metadata.gz.sig +1 -1
- data/lib/mobility/backends/active_record/query_methods.rb +0 -50
- data/lib/mobility/backends/sequel/column/query_methods.rb +0 -29
- data/lib/mobility/backends/sequel/container/json_query_methods.rb +0 -41
- data/lib/mobility/backends/sequel/container/jsonb_query_methods.rb +0 -41
- data/lib/mobility/backends/sequel/hstore/query_methods.rb +0 -34
- data/lib/mobility/backends/sequel/json/query_methods.rb +0 -34
- data/lib/mobility/backends/sequel/jsonb/query_methods.rb +0 -34
- data/lib/mobility/backends/sequel/key_value/query_methods.rb +0 -58
- data/lib/mobility/backends/sequel/pg_query_methods.rb +0 -114
- data/lib/mobility/backends/sequel/query_methods.rb +0 -36
- data/lib/mobility/backends/sequel/serialized/query_methods.rb +0 -22
- data/lib/mobility/backends/sequel/table/query_methods.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93685e1d8296d7f0f9c2a74e07a40af397fa1eef52d2d8c51d63ac6ed7a33812
|
4
|
+
data.tar.gz: be5beb1769d824f8687b0d2e5b796738ffa98dd35e6018de126ce909e089c278
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dfa4ca2101b75d34a62d8a445bb58cf84a75d39346568bd816d064bdfc637fb11e8e79cf963789d18cde779ce588fff596d264b728f68cf53c382ad57a5ccb9
|
7
|
+
data.tar.gz: 3b907f55dffe8823d12f2b04bb57fea611cea6ac316f4572859c484e8692a89179d1114c8966ad801007d6833615943abf9c7ff89be5c924f9b9b719cdc25894
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
# Mobility Changelog
|
2
2
|
|
3
|
-
## 0.
|
3
|
+
## 0.8
|
4
|
+
|
5
|
+
### 0.8.0 (September 11, 2018)
|
6
|
+
* Support order clause on translated queries (ActiveRecord)
|
7
|
+
([#261](https://github.com/shioyama/mobility/pull/261))
|
8
|
+
* Restructure Sequel querying into plugin
|
9
|
+
([#255](https://github.com/shioyama/mobility/pull/255),
|
10
|
+
[#267](https://github.com/shioyama/mobility/pull/267),
|
11
|
+
[#268](https://github.com/shioyama/mobility/pull/267))
|
12
|
+
* Default locale to Mobility.locale in apply_scope
|
13
|
+
([#263](https://github.com/shioyama/mobility/pull/263))
|
4
14
|
|
5
15
|
### 0.7.6 (July 6, 2018)
|
6
16
|
* Sequel pg_hash require hash_initializer
|
@@ -33,7 +43,7 @@
|
|
33
43
|
* Restructure querying into plugin (ActiveRecord only)
|
34
44
|
([#216](https://github.com/shioyama/mobility/pull/216),
|
35
45
|
[#225](https://github.com/shioyama/mobility/pull/225),
|
36
|
-
[#222](https://github.com/shioyama/mobility/pull/222)
|
46
|
+
[#222](https://github.com/shioyama/mobility/pull/222))
|
37
47
|
* Support querying on multiple locales at once
|
38
48
|
([#232](https://github.com/shioyama/mobility/pull/232))
|
39
49
|
* Allow passing locale to query methods
|
@@ -49,7 +59,8 @@
|
|
49
59
|
([#241](https://github.com/shioyama/mobility/pull/241))
|
50
60
|
* Define options on subclassed backend class
|
51
61
|
([#218](https://github.com/shioyama/mobility/pull/218))
|
52
|
-
* Add column_affix
|
62
|
+
* Add column_affix when configuring options
|
63
|
+
([#217](https://github.com/shioyama/mobility/pull/217))
|
53
64
|
* Use module_eval to define locale_accessors
|
54
65
|
([#219](https://github.com/shioyama/mobility/pull/219))
|
55
66
|
* Improve performance of getters/setters
|
data/Gemfile.lock
CHANGED
@@ -8,14 +8,45 @@ PATH
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
+
actionpack (5.2.1)
|
12
|
+
actionview (= 5.2.1)
|
13
|
+
activesupport (= 5.2.1)
|
14
|
+
rack (~> 2.0)
|
15
|
+
rack-test (>= 0.6.3)
|
16
|
+
rails-dom-testing (~> 2.0)
|
17
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
18
|
+
actionview (5.2.1)
|
19
|
+
activesupport (= 5.2.1)
|
20
|
+
builder (~> 3.1)
|
21
|
+
erubi (~> 1.4)
|
22
|
+
rails-dom-testing (~> 2.0)
|
23
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
24
|
+
activemodel (5.2.1)
|
25
|
+
activesupport (= 5.2.1)
|
26
|
+
activerecord (5.2.1)
|
27
|
+
activemodel (= 5.2.1)
|
28
|
+
activesupport (= 5.2.1)
|
29
|
+
arel (>= 9.0)
|
30
|
+
activesupport (5.2.1)
|
31
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
32
|
+
i18n (>= 0.7, < 2)
|
33
|
+
minitest (~> 5.1)
|
34
|
+
tzinfo (~> 1.1)
|
35
|
+
arel (9.0.0)
|
11
36
|
benchmark-ips (2.7.2)
|
37
|
+
builder (3.2.3)
|
12
38
|
byebug (10.0.2)
|
13
39
|
coderay (1.1.2)
|
14
40
|
concurrent-ruby (1.0.5)
|
41
|
+
crass (1.0.4)
|
15
42
|
database_cleaner (1.7.0)
|
16
43
|
diff-lcs (1.3)
|
44
|
+
erubi (1.7.1)
|
17
45
|
ffi (1.9.24)
|
18
46
|
formatador (0.2.5)
|
47
|
+
generator_spec (0.9.4)
|
48
|
+
activesupport (>= 3.0.0)
|
49
|
+
railties (>= 3.0.0)
|
19
50
|
guard (2.14.2)
|
20
51
|
formatador (>= 0.2.4)
|
21
52
|
listen (>= 2.7, < 4.0)
|
@@ -36,10 +67,17 @@ GEM
|
|
36
67
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
37
68
|
rb-inotify (~> 0.9, >= 0.9.7)
|
38
69
|
ruby_dep (~> 1.2)
|
70
|
+
loofah (2.2.2)
|
71
|
+
crass (~> 1.0.2)
|
72
|
+
nokogiri (>= 1.5.9)
|
39
73
|
lumberjack (1.0.13)
|
40
74
|
method_source (0.9.0)
|
75
|
+
mini_portile2 (2.3.0)
|
76
|
+
minitest (5.11.3)
|
41
77
|
mysql2 (0.4.10)
|
42
78
|
nenv (0.3.0)
|
79
|
+
nokogiri (1.8.4)
|
80
|
+
mini_portile2 (~> 2.3.0)
|
43
81
|
notiffany (0.1.1)
|
44
82
|
nenv (~> 0.1)
|
45
83
|
shellany (~> 0.0)
|
@@ -51,6 +89,19 @@ GEM
|
|
51
89
|
byebug (~> 10.0)
|
52
90
|
pry (~> 0.10)
|
53
91
|
rack (2.0.5)
|
92
|
+
rack-test (1.1.0)
|
93
|
+
rack (>= 1.0, < 3)
|
94
|
+
rails-dom-testing (2.0.3)
|
95
|
+
activesupport (>= 4.2.0)
|
96
|
+
nokogiri (>= 1.6)
|
97
|
+
rails-html-sanitizer (1.0.4)
|
98
|
+
loofah (~> 2.2, >= 2.2.2)
|
99
|
+
railties (5.2.1)
|
100
|
+
actionpack (= 5.2.1)
|
101
|
+
activesupport (= 5.2.1)
|
102
|
+
method_source
|
103
|
+
rake (>= 0.8.7)
|
104
|
+
thor (>= 0.19.0, < 2.0)
|
54
105
|
rake (12.3.1)
|
55
106
|
rb-fsevent (0.10.3)
|
56
107
|
rb-inotify (0.9.10)
|
@@ -74,19 +125,25 @@ GEM
|
|
74
125
|
shellany (0.0.1)
|
75
126
|
sqlite3 (1.3.13)
|
76
127
|
thor (0.20.0)
|
128
|
+
thread_safe (0.3.6)
|
129
|
+
tzinfo (1.2.5)
|
130
|
+
thread_safe (~> 0.1)
|
77
131
|
yard (0.9.14)
|
78
132
|
|
79
133
|
PLATFORMS
|
80
134
|
ruby
|
81
135
|
|
82
136
|
DEPENDENCIES
|
137
|
+
activerecord (>= 5.2.0.rc2, < 5.3)
|
83
138
|
benchmark-ips
|
84
139
|
database_cleaner (~> 1.5, >= 1.5.3)
|
140
|
+
generator_spec (~> 0.9.4)
|
85
141
|
guard-rspec
|
86
142
|
mobility!
|
87
143
|
mysql2 (~> 0.4.9)
|
88
144
|
pg (< 1.0)
|
89
145
|
pry-byebug
|
146
|
+
railties (>= 5.2.0.rc2, < 5.3)
|
90
147
|
rake (~> 12, >= 12.2.1)
|
91
148
|
rspec (~> 3.0)
|
92
149
|
sqlite3
|
data/README.md
CHANGED
@@ -51,7 +51,7 @@ Installation
|
|
51
51
|
Add this line to your application's Gemfile:
|
52
52
|
|
53
53
|
```ruby
|
54
|
-
gem 'mobility', '~> 0.
|
54
|
+
gem 'mobility', '~> 0.8.0'
|
55
55
|
```
|
56
56
|
|
57
57
|
Mobility is cryptographically signed. To be sure the gem you install hasn't
|
@@ -673,7 +673,7 @@ different ways. The first is via query methods like `where` (and `not` and
|
|
673
673
|
`i18n` class method, which will return a model relation or dataset extended
|
674
674
|
with Mobility-specific query method overrides.
|
675
675
|
|
676
|
-
So for ActiveRecord, assuming a model:
|
676
|
+
So for ActiveRecord, assuming a model using KeyValue as its default backend:
|
677
677
|
|
678
678
|
```ruby
|
679
679
|
class Post < ApplicationRecord
|
@@ -740,7 +740,7 @@ pass a block to the query method and call attribute names from the block scope
|
|
740
740
|
to build Arel predicates:
|
741
741
|
|
742
742
|
```ruby
|
743
|
-
Post.i18n do
|
743
|
+
Post.i18n do
|
744
744
|
title.matches("foo").and(content.matches("bar"))
|
745
745
|
end
|
746
746
|
```
|
@@ -756,7 +756,8 @@ WHERE "Post_title_en_string_translations"."value" ILIKE 'foo'
|
|
756
756
|
|
757
757
|
The block-format query format is very powerful and allows you to build complex
|
758
758
|
backend-independent queries on translated and untranslated attributes without
|
759
|
-
having to deal with the details of how these translations are stored.
|
759
|
+
having to deal with the details of how these translations are stored. The same
|
760
|
+
interface is supported with Sequel to build datasets.
|
760
761
|
|
761
762
|
<a name="backends"></a>Backends
|
762
763
|
--------
|
@@ -930,6 +931,16 @@ Integrations
|
|
930
931
|
* [friendly_id-mobility](https://github.com/shioyama/friendly_id-mobility): Use
|
931
932
|
Mobility with [FriendlyId](https://github.com/norman/friendly_id).
|
932
933
|
|
934
|
+
Tutorials
|
935
|
+
---------
|
936
|
+
|
937
|
+
- [Polyglot content in a rails
|
938
|
+
app](https://revs.runtime-revolution.com/polyglot-content-in-a-rails-app-aed823854955)
|
939
|
+
- [Translating with
|
940
|
+
Mobility](https://dejimata.com/2017/3/3/translating-with-mobility)
|
941
|
+
- [JSONify your Ruby
|
942
|
+
Translations](https://dejimata.com/2018/3/20/jsonify-your-ruby-translations)
|
943
|
+
|
933
944
|
More Information
|
934
945
|
----------------
|
935
946
|
|
data/lib/mobility.rb
CHANGED
@@ -117,7 +117,7 @@ module Mobility
|
|
117
117
|
# Sets Mobility locale
|
118
118
|
# @param [Symbol] locale Locale to set
|
119
119
|
# @raise [InvalidLocale] if locale is nil or not in
|
120
|
-
# +
|
120
|
+
# +Mobility.available_locales+ (if +I18n.enforce_available_locales+ is +true+)
|
121
121
|
# @return [Symbol] Locale
|
122
122
|
def locale=(locale)
|
123
123
|
set_locale(locale)
|
@@ -239,6 +239,22 @@ EOL
|
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
+
# Returns available locales. Defaults to I18n.available_locales, but will
|
243
|
+
# use Rails.application.config.i18n.available_locales if Rails is loaded
|
244
|
+
# and config is non-nil.
|
245
|
+
# @return [Array<Symbol>] Available locales
|
246
|
+
# @note The special case for Rails is necessary due to the fact that Rails
|
247
|
+
# may load the model before setting +I18n.available_locales+. If we
|
248
|
+
# simply default to +I18n.available_locales+, we may define many more
|
249
|
+
# methods (in LocaleAccessors) than is really necessary.
|
250
|
+
def available_locales
|
251
|
+
if Loaded::Rails && Rails.application
|
252
|
+
Rails.application.config.i18n.available_locales || I18n.available_locales
|
253
|
+
else
|
254
|
+
I18n.available_locales
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
242
258
|
protected
|
243
259
|
|
244
260
|
def read_locale
|
@@ -27,7 +27,7 @@ To use the validator, you must +extend Mobility+ before calling +validates+
|
|
27
27
|
|
28
28
|
if (([*options[:scope]] + [attribute]).map(&:to_s) & klass.mobility_attributes).present?
|
29
29
|
return unless value.present?
|
30
|
-
relation = klass.__mobility_query_scope__ do |m|
|
30
|
+
relation = klass.unscoped.__mobility_query_scope__ do |m|
|
31
31
|
node = m.__send__(attribute)
|
32
32
|
options[:case_sensitive] == false ? node.lower.eq(value.downcase) : node.eq(value)
|
33
33
|
end
|
data/lib/mobility/arel/nodes.rb
CHANGED
@@ -2,13 +2,10 @@
|
|
2
2
|
module Mobility
|
3
3
|
module Arel
|
4
4
|
module Nodes
|
5
|
-
class Unary < ::Arel::Nodes::Unary; end
|
6
5
|
class Binary < ::Arel::Nodes::Binary; end
|
7
6
|
class Grouping < ::Arel::Nodes::Grouping; end
|
8
|
-
class Equality < ::Arel::Nodes::Equality; end
|
9
7
|
|
10
8
|
::Arel::Visitors::ToSql.class_eval do
|
11
|
-
alias :visit_Mobility_Arel_Nodes_Equality :visit_Arel_Nodes_Equality
|
12
9
|
alias :visit_Mobility_Arel_Nodes_Grouping :visit_Arel_Nodes_Grouping
|
13
10
|
end
|
14
11
|
end
|
data/lib/mobility/attributes.rb
CHANGED
@@ -20,53 +20,61 @@ like including a module. Creating an instance like this:
|
|
20
20
|
|
21
21
|
Attributes.new("title", backend: :my_backend, locale_accessors: [:en, :ja], cache: true, fallbacks: true)
|
22
22
|
|
23
|
-
will generate an anonymous module that behaves
|
23
|
+
will generate an anonymous module that behaves approximately like this:
|
24
24
|
|
25
25
|
Module.new do
|
26
|
-
def
|
27
|
-
#
|
26
|
+
def mobility_backends
|
27
|
+
# Returns a memoized hash with attribute name keys and backend instance
|
28
|
+
# values. When a key is fetched from the hash, the hash calls
|
29
|
+
# +self.class.mobility_backend_class(name)+ (where +name+ is the
|
30
|
+
# attribute name) to get the backend class, then instantiate it (passing
|
31
|
+
# the model instance and attribute name to its initializer) and return it.
|
32
|
+
#
|
33
|
+
# The backend class returned from the class method
|
34
|
+
# +mobility_backend_class+ returns a subclass of
|
35
|
+
# +Mobility::Backends::MyBackend+ and includes into it:
|
36
|
+
#
|
28
37
|
# - Mobility::Plugins::Cache (from the +cache: true+ option)
|
29
|
-
# - Mobility::Plugins::Fallbacks (from the +fallbacks: true+ option)
|
38
|
+
# - instance of Mobility::Plugins::Fallbacks (from the +fallbacks: true+ option)
|
30
39
|
# - Mobility::Plugins::Presence (by default, disabled by +presence: false+)
|
31
|
-
# Then instantiate the backend, memoize it, and return it.
|
32
40
|
end
|
33
41
|
|
34
|
-
def title(
|
35
|
-
|
42
|
+
def title(locale: Mobility.locale)
|
43
|
+
mobility_backends[:title].read(locale)
|
36
44
|
end
|
37
45
|
|
38
|
-
def title?(
|
39
|
-
|
46
|
+
def title?(locale: Mobility.locale)
|
47
|
+
mobility_backends[:title].read(locale).present?
|
40
48
|
end
|
41
49
|
|
42
|
-
def title=(value)
|
43
|
-
|
50
|
+
def title=(value, locale: Mobility.locale)
|
51
|
+
mobility_backends[:title].write(locale, value)
|
44
52
|
end
|
45
53
|
|
46
54
|
# Start Locale Accessors
|
47
55
|
#
|
48
|
-
def title_en
|
49
|
-
|
56
|
+
def title_en
|
57
|
+
title(locale: :en)
|
50
58
|
end
|
51
59
|
|
52
|
-
def title_en?
|
53
|
-
|
60
|
+
def title_en?
|
61
|
+
title?(locale: :en)
|
54
62
|
end
|
55
63
|
|
56
64
|
def title_en=(value)
|
57
|
-
|
65
|
+
public_send(:title=, value, locale: :en)
|
58
66
|
end
|
59
67
|
|
60
|
-
def title_ja
|
61
|
-
|
68
|
+
def title_ja
|
69
|
+
title(locale: :ja)
|
62
70
|
end
|
63
71
|
|
64
|
-
def title_ja?
|
65
|
-
|
72
|
+
def title_ja?
|
73
|
+
title?(locale: :ja)
|
66
74
|
end
|
67
75
|
|
68
76
|
def title_ja=(value)
|
69
|
-
|
77
|
+
public_send(:title=, value, locale: :ja)
|
70
78
|
end
|
71
79
|
# End Locale Accessors
|
72
80
|
end
|
@@ -75,6 +83,10 @@ Including this module into a model class will thus add the backend method, the
|
|
75
83
|
reader, writer and presence methods, and the locale accessor so the model
|
76
84
|
class. (These methods are in fact added to the model in an +included+ hook.)
|
77
85
|
|
86
|
+
Note that some simplifications have been made above for readability. (In
|
87
|
+
reality, all getters and setters accept an options hash which is passed along
|
88
|
+
to the backend instance.)
|
89
|
+
|
78
90
|
==Setting up the Model Class
|
79
91
|
|
80
92
|
Accessor methods alone are of limited use without a hook to actually modify the
|
@@ -88,9 +100,6 @@ This allows a backend to do things like (for example) define associations on a
|
|
88
100
|
model class required by the backend, as happens in the {Backends::KeyValue} and
|
89
101
|
{Backends::Table} backends.
|
90
102
|
|
91
|
-
The +setup+ block is also used to extend the query scope/dataset (+i18n+ by
|
92
|
-
default) with backend-specific query method support.
|
93
|
-
|
94
103
|
Since setup blocks are evaluated on the model class, it is possible that
|
95
104
|
backends can conflict (for example, overwriting previously defined methods).
|
96
105
|
Care should be taken to avoid defining methods on the model class, or where
|
@@ -244,6 +253,7 @@ EOL
|
|
244
253
|
module InstanceMethods
|
245
254
|
# Return a new backend for an attribute name.
|
246
255
|
# @return [Hash] Hash of attribute names and backend instances
|
256
|
+
# @api private
|
247
257
|
def mobility_backends
|
248
258
|
@mobility_backends ||= Hash.new do |hash, name|
|
249
259
|
next hash[name.to_sym] if String === name
|
@@ -262,7 +272,7 @@ EOL
|
|
262
272
|
# of this model.
|
263
273
|
# @return [Array<Mobility::Attributes>] Attribute modules
|
264
274
|
def mobility_modules
|
265
|
-
ancestors.
|
275
|
+
ancestors.grep(Attributes)
|
266
276
|
end
|
267
277
|
|
268
278
|
# Return translated attribute names on this model.
|
@@ -271,6 +281,13 @@ EOL
|
|
271
281
|
mobility_modules.map(&:names).flatten.uniq
|
272
282
|
end
|
273
283
|
|
284
|
+
# Return true if attribute name is translated on this model.
|
285
|
+
# @param [String, Symbol] Attribute name
|
286
|
+
# @return [Boolean]
|
287
|
+
def mobility_attribute?(name)
|
288
|
+
mobility_attributes.include?(name.to_s)
|
289
|
+
end
|
290
|
+
|
274
291
|
# @!method translated_attribute_names
|
275
292
|
# @return (see #mobility_attributes)
|
276
293
|
alias translated_attribute_names mobility_attributes
|
@@ -22,10 +22,10 @@ module Mobility
|
|
22
22
|
|
23
23
|
# @param [ActiveRecord::Relation] relation Relation to scope
|
24
24
|
# @param [Object] predicate Arel predicate
|
25
|
-
# @param [Symbol] locale Locale
|
25
|
+
# @param [Symbol] locale (Mobility.locale) Locale
|
26
26
|
# @option [Boolean] invert
|
27
27
|
# @return [ActiveRecord::Relation] Relation with scope added
|
28
|
-
def apply_scope(relation, _predicate, _locale, invert: false)
|
28
|
+
def apply_scope(relation, _predicate, _locale = Mobility.locale, invert: false)
|
29
29
|
relation
|
30
30
|
end
|
31
31
|
|
@@ -14,8 +14,8 @@ translatable columns to the model table with:
|
|
14
14
|
rails generate mobility:translations post title:string
|
15
15
|
|
16
16
|
The generated migration will add columns +title_<locale>+ for every locale in
|
17
|
-
+I18n.available_locales
|
18
|
-
or locales.)
|
17
|
+
+Mobility.available_locales+ (i.e. +I18n.available_locales+). (The generator
|
18
|
+
can be run again to add new attributes or locales.)
|
19
19
|
|
20
20
|
@example
|
21
21
|
class Post < ActiveRecord::Base
|
@@ -29,8 +29,6 @@ Implements the {Mobility::Backends::KeyValue} backend for ActiveRecord models.
|
|
29
29
|
include ActiveRecord
|
30
30
|
include KeyValue
|
31
31
|
|
32
|
-
option_reader :table_alias_affix
|
33
|
-
|
34
32
|
class << self
|
35
33
|
# @!group Backend Configuration
|
36
34
|
# @option (see Mobility::Backends::KeyValue::ClassMethods#configure)
|
@@ -59,10 +57,10 @@ Implements the {Mobility::Backends::KeyValue} backend for ActiveRecord models.
|
|
59
57
|
# Joins translations using either INNER/OUTER join appropriate to the query.
|
60
58
|
# @param [ActiveRecord::Relation] relation Relation to scope
|
61
59
|
# @param [Object] predicate Arel predicate
|
62
|
-
# @param [Symbol] locale Locale
|
60
|
+
# @param [Symbol] locale (Mobility.locale) Locale
|
63
61
|
# @option [Boolean] invert
|
64
62
|
# @return [ActiveRecord::Relation] relation Relation with joins applied (if needed)
|
65
|
-
def apply_scope(relation, predicate, locale, invert: false)
|
63
|
+
def apply_scope(relation, predicate, locale = Mobility.locale, invert: false)
|
66
64
|
visitor = Visitor.new(self, locale)
|
67
65
|
visitor.accept(predicate).inject(relation) do |rel, (attr, join_type)|
|
68
66
|
join_type &&= ::Arel::Nodes::InnerJoin if invert
|
@@ -72,10 +70,6 @@ Implements the {Mobility::Backends::KeyValue} backend for ActiveRecord models.
|
|
72
70
|
|
73
71
|
private
|
74
72
|
|
75
|
-
def table_alias(attr, locale)
|
76
|
-
table_alias_affix % "#{attr}_#{Mobility.normalize_locale(locale)}"
|
77
|
-
end
|
78
|
-
|
79
73
|
def join_translations(relation, key, locale, join_type)
|
80
74
|
return relation if already_joined?(relation, key, locale, join_type)
|
81
75
|
m = model_class.arel_table
|
@@ -114,7 +108,10 @@ Implements the {Mobility::Backends::KeyValue} backend for ActiveRecord models.
|
|
114
108
|
# end
|
115
109
|
#
|
116
110
|
# backend_class = Post.mobility_backend_class(:title)
|
117
|
-
# visitor = Mobility::Backends::ActiveRecord::KeyValue::Visitor.new(backend_class)
|
111
|
+
# visitor = Mobility::Backends::ActiveRecord::KeyValue::Visitor.new(backend_class, :en)
|
112
|
+
#
|
113
|
+
# title = backend_class.build_node("title", :en) # arel node for title
|
114
|
+
# content = backend_class.build_node("content", :en) # arel node for content
|
118
115
|
#
|
119
116
|
# visitor.accept(title.eq("foo").and(content.eq(nil)))
|
120
117
|
# #=> { title: Arel::Nodes::InnerJoin, content: Arel::Nodes::OuterJoin }
|