mobility 0.1.20 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -0
  4. data/CHANGELOG.md +17 -0
  5. data/CONTRIBUTING.md +55 -0
  6. data/Gemfile +2 -0
  7. data/Gemfile.lock +2 -56
  8. data/README.md +64 -15
  9. data/Rakefile +17 -17
  10. data/lib/mobility.rb +43 -40
  11. data/lib/mobility/active_model.rb +0 -1
  12. data/lib/mobility/active_model/backend_resetter.rb +1 -1
  13. data/lib/mobility/active_record.rb +8 -15
  14. data/lib/mobility/active_record/backend_resetter.rb +2 -0
  15. data/lib/mobility/active_record/model_translation.rb +1 -1
  16. data/lib/mobility/active_record/string_translation.rb +2 -0
  17. data/lib/mobility/active_record/text_translation.rb +2 -0
  18. data/lib/mobility/attributes.rb +74 -71
  19. data/lib/mobility/backend.rb +64 -25
  20. data/lib/mobility/backend/orm_delegator.rb +17 -7
  21. data/lib/mobility/backend/stringify_locale.rb +18 -0
  22. data/lib/mobility/backend_resetter.rb +8 -5
  23. data/lib/mobility/backends.rb +4 -0
  24. data/lib/mobility/backends/active_record.rb +20 -0
  25. data/lib/mobility/{backend → backends}/active_record/column.rb +25 -13
  26. data/lib/mobility/{backend → backends}/active_record/column/query_methods.rb +5 -3
  27. data/lib/mobility/backends/active_record/hstore.rb +29 -0
  28. data/lib/mobility/{backend → backends}/active_record/hstore/query_methods.rb +2 -2
  29. data/lib/mobility/{backend → backends}/active_record/jsonb.rb +6 -6
  30. data/lib/mobility/{backend → backends}/active_record/jsonb/query_methods.rb +4 -2
  31. data/lib/mobility/{backend → backends}/active_record/key_value.rb +10 -44
  32. data/lib/mobility/{backend → backends}/active_record/key_value/query_methods.rb +4 -2
  33. data/lib/mobility/{backend/active_record/hash_valued.rb → backends/active_record/pg_hash.rb} +13 -21
  34. data/lib/mobility/{backend → backends}/active_record/query_methods.rb +2 -2
  35. data/lib/mobility/{backend → backends}/active_record/serialized.rb +12 -28
  36. data/lib/mobility/{backend → backends}/active_record/serialized/query_methods.rb +5 -8
  37. data/lib/mobility/{backend → backends}/active_record/table.rb +11 -60
  38. data/lib/mobility/{backend → backends}/active_record/table/query_methods.rb +5 -3
  39. data/lib/mobility/{backend → backends}/column.rb +8 -4
  40. data/lib/mobility/backends/hash_valued.rb +29 -0
  41. data/lib/mobility/{backend → backends}/hstore.rb +4 -4
  42. data/lib/mobility/{backend → backends}/jsonb.rb +4 -4
  43. data/lib/mobility/backends/key_value.rb +111 -0
  44. data/lib/mobility/{backend → backends}/null.rb +4 -4
  45. data/lib/mobility/backends/sequel.rb +20 -0
  46. data/lib/mobility/backends/sequel/column.rb +52 -0
  47. data/lib/mobility/{backend → backends}/sequel/column/query_methods.rb +5 -3
  48. data/lib/mobility/backends/sequel/hstore.rb +29 -0
  49. data/lib/mobility/{backend → backends}/sequel/hstore/query_methods.rb +4 -3
  50. data/lib/mobility/{backend → backends}/sequel/jsonb.rb +6 -6
  51. data/lib/mobility/{backend → backends}/sequel/jsonb/query_methods.rb +4 -3
  52. data/lib/mobility/{backend → backends}/sequel/key_value.rb +28 -39
  53. data/lib/mobility/{backend → backends}/sequel/key_value/query_methods.rb +4 -5
  54. data/lib/mobility/backends/sequel/pg_hash.rb +46 -0
  55. data/lib/mobility/{backend → backends}/sequel/postgres_query_methods.rb +1 -2
  56. data/lib/mobility/{backend → backends}/sequel/query_methods.rb +6 -4
  57. data/lib/mobility/{backend → backends}/sequel/serialized.rb +17 -38
  58. data/lib/mobility/backends/sequel/serialized/query_methods.rb +17 -0
  59. data/lib/mobility/{backend → backends}/sequel/table.rb +29 -60
  60. data/lib/mobility/{backend → backends}/sequel/table/query_methods.rb +5 -3
  61. data/lib/mobility/{backend → backends}/serialized.rb +27 -5
  62. data/lib/mobility/{backend → backends}/table.rb +69 -29
  63. data/lib/mobility/configuration.rb +40 -0
  64. data/lib/mobility/{orm.rb → loaded.rb} +0 -0
  65. data/lib/mobility/plugins.rb +35 -0
  66. data/lib/mobility/plugins/active_model.rb +6 -0
  67. data/lib/mobility/plugins/active_model/dirty.rb +81 -0
  68. data/lib/mobility/plugins/active_record.rb +6 -0
  69. data/lib/mobility/plugins/active_record/dirty.rb +59 -0
  70. data/lib/mobility/plugins/cache.rb +54 -0
  71. data/lib/mobility/plugins/cache/translation_cacher.rb +40 -0
  72. data/lib/mobility/plugins/default.rb +73 -0
  73. data/lib/mobility/plugins/dirty.rb +61 -0
  74. data/lib/mobility/{backend → plugins}/fallbacks.rb +36 -31
  75. data/lib/mobility/plugins/fallthrough_accessors.rb +66 -0
  76. data/lib/mobility/plugins/locale_accessors.rb +84 -0
  77. data/lib/mobility/{backend → plugins}/presence.rb +15 -6
  78. data/lib/mobility/plugins/sequel.rb +6 -0
  79. data/lib/mobility/plugins/sequel/dirty.rb +59 -0
  80. data/lib/mobility/sequel.rb +5 -14
  81. data/lib/mobility/sequel/backend_resetter.rb +4 -6
  82. data/lib/mobility/sequel/column_changes.rb +4 -4
  83. data/lib/mobility/sequel/model_translation.rb +1 -1
  84. data/lib/mobility/sequel/string_translation.rb +2 -0
  85. data/lib/mobility/sequel/text_translation.rb +2 -0
  86. data/lib/mobility/translates.rb +1 -5
  87. data/lib/mobility/util.rb +126 -0
  88. data/lib/mobility/version.rb +1 -1
  89. data/lib/mobility/wrapper.rb +1 -1
  90. data/lib/rails/generators/mobility/translations_generator.rb +7 -3
  91. metadata +85 -55
  92. metadata.gz.sig +0 -0
  93. data/lib/mobility/backend/active_model.rb +0 -7
  94. data/lib/mobility/backend/active_model/dirty.rb +0 -95
  95. data/lib/mobility/backend/active_record.rb +0 -29
  96. data/lib/mobility/backend/active_record/dirty.rb +0 -54
  97. data/lib/mobility/backend/active_record/hstore.rb +0 -29
  98. data/lib/mobility/backend/cache.rb +0 -117
  99. data/lib/mobility/backend/dirty.rb +0 -38
  100. data/lib/mobility/backend/key_value.rb +0 -85
  101. data/lib/mobility/backend/sequel.rb +0 -29
  102. data/lib/mobility/backend/sequel/column.rb +0 -39
  103. data/lib/mobility/backend/sequel/dirty.rb +0 -57
  104. data/lib/mobility/backend/sequel/hash_valued.rb +0 -51
  105. data/lib/mobility/backend/sequel/hstore.rb +0 -29
  106. data/lib/mobility/backend/sequel/serialized/query_methods.rb +0 -20
  107. data/lib/mobility/core_ext/object.rb +0 -30
  108. data/lib/mobility/core_ext/string.rb +0 -16
  109. data/lib/mobility/fallthrough_accessors.rb +0 -57
  110. data/lib/mobility/locale_accessors.rb +0 -55
@@ -1,4 +1,5 @@
1
1
  # frozen-string-literal: true
2
+ require "mobility/backend/orm_delegator"
2
3
 
3
4
  module Mobility
4
5
  =begin
@@ -8,9 +9,8 @@ Defines a minimum set of shared components included in any backend. These are:
8
9
  - a reader returning the +model+ on which the backend is defined ({#model})
9
10
  - a reader returning the +attribute+ for which the backend is defined
10
11
  ({#attribute})
11
- - a reader returning +options+ configuring the backend ({#options})
12
- - a constructor setting these three elements (+model+, +attribute+, +options+),
13
- and extracting fallbacks from the options hash ({#initialize})
12
+ - a constructor setting these two elements (+model+, +attribute+), and
13
+ extracting fallbacks from the options hash ({#initialize})
14
14
  - a +setup+ method adding any configuration code to the model class
15
15
  ({Setup#setup})
16
16
 
@@ -18,6 +18,8 @@ On top of this, a backend will normally:
18
18
 
19
19
  - implement a +read+ instance method to read from the backend
20
20
  - implement a +write+ instance method to write to the backend
21
+ - implement an +each_locale+ instance method to iterate through available locales
22
+ (used to define other +Enumerable+ traversal and search methods)
21
23
  - implement a +configure+ class method to apply any normalization to the
22
24
  options hash
23
25
  - call the +setup+ method yielding attributes and options to configure the
@@ -27,11 +29,15 @@ On top of this, a backend will normally:
27
29
  class MyBackend
28
30
  include Mobility::Backend
29
31
 
30
- def read(locale, **options)
32
+ def read(locale, options = {})
31
33
  # ...
32
34
  end
33
35
 
34
- def write(locale, value, **options)
36
+ def write(locale, value, options = {})
37
+ # ...
38
+ end
39
+
40
+ def each_locale
35
41
  # ...
36
42
  end
37
43
 
@@ -49,21 +55,7 @@ On top of this, a backend will normally:
49
55
  =end
50
56
 
51
57
  module Backend
52
- autoload :ActiveModel, 'mobility/backend/active_model'
53
- autoload :ActiveRecord, 'mobility/backend/active_record'
54
- autoload :Cache, 'mobility/backend/cache'
55
- autoload :Column, 'mobility/backend/column'
56
- autoload :Dirty, 'mobility/backend/dirty'
57
- autoload :Fallbacks, 'mobility/backend/fallbacks'
58
- autoload :Hstore, 'mobility/backend/hstore'
59
- autoload :Jsonb, 'mobility/backend/jsonb'
60
- autoload :KeyValue, 'mobility/backend/key_value'
61
- autoload :Null, 'mobility/backend/null'
62
- autoload :OrmDelegator, 'mobility/backend/orm_delegator'
63
- autoload :Presence, 'mobility/backend/presence'
64
- autoload :Sequel, 'mobility/backend/sequel'
65
- autoload :Serialized, 'mobility/backend/serialized'
66
- autoload :Table, 'mobility/backend/table'
58
+ include Enumerable
67
59
 
68
60
  # @return [String] Backend attribute
69
61
  attr_reader :attribute
@@ -80,29 +72,57 @@ On top of this, a backend will normally:
80
72
  end
81
73
 
82
74
  # @!macro [new] backend_reader
75
+ # Gets the translated value for provided locale from configured backend.
83
76
  # @param [Symbol] locale Locale to read
84
77
  # @return [Object] Value of translation
85
78
  #
86
79
  # @!macro [new] backend_writer
80
+ # Updates translation for provided locale without calling backend's methods to persist the changes.
87
81
  # @param [Symbol] locale Locale to write
88
82
  # @param [Object] value Value to write
89
83
  # @return [Object] Updated value
90
84
 
85
+ # @!macro [new] backend_iterator
86
+ # Yields locales available for this attribute.
87
+ # @yieldparam [Symbol] Locale
88
+ def each_locale
89
+ end
90
+
91
+ # Yields translations to block
92
+ # @yieldparam [Mobility::Backend::Translation] Translation
93
+ def each
94
+ each_locale { |locale| yield Translation.new(self, locale) }
95
+ end
96
+
97
+ # List locales available for this backend.
98
+ # @return [Array<Symbol>] Array of available locales
99
+ def locales
100
+ map(&:locale)
101
+ end
102
+
103
+ # @param [Symbol] locale Locale to read
104
+ # @return [TrueClass,FalseClass] Whether translation is present for locale
105
+ def present?(locale, options = {})
106
+ Util.present?(read(locale, options))
107
+ end
108
+
91
109
  # Extend included class with +setup+ method
92
110
  def self.included(base)
93
111
  base.extend(Setup)
112
+ base.extend(ClassMethods)
94
113
  end
95
114
 
96
115
  # @param [String] attribute
97
116
  # @return [String] name of backend reader method
98
117
  def self.method_name(attribute)
99
- "#{attribute}_backend".freeze
118
+ @backend_method_names ||= {}
119
+ @backend_method_names[attribute] ||= "#{attribute}_backend".freeze
100
120
  end
101
121
 
102
122
  # Defines setup hooks for backend to customize model class.
103
123
  module Setup
104
124
  # Assign block to be called on model class.
105
- # @yield [attributes, options]
125
+ # @yield [attribute_names, options]
106
126
  # @note When called multiple times, setup blocks will be appended
107
127
  # so that they are run together consecutively on class.
108
128
  def setup &block
@@ -123,13 +143,15 @@ On top of this, a backend will normally:
123
143
 
124
144
  # Call setup block on a class with attributes and options.
125
145
  # @param model_class Class to be setup-ed
126
- # @param [Array<String>] attributes
146
+ # @param [Array<String>] attribute_names
127
147
  # @param [Hash] options
128
- def setup_model(model_class, attributes, **options)
148
+ def setup_model(model_class, attribute_names, **options)
129
149
  return unless setup_block = @setup_block
130
- model_class.class_exec(attributes, options, &setup_block)
150
+ model_class.class_exec(attribute_names, options, &setup_block)
131
151
  end
152
+ end
132
153
 
154
+ module ClassMethods
133
155
  # {Attributes} uses this method to get a backend class specific to the
134
156
  # model using the backend. Backend classes can override this method to
135
157
  # return a class specific to the model class using the backend (e.g.
@@ -141,6 +163,23 @@ On top of this, a backend will normally:
141
163
  def for(_)
142
164
  self
143
165
  end
166
+
167
+ # Called from plugins to apply custom processing for this backend.
168
+ # Name is the name of the plugin.
169
+ # @param [Symbol] name Name of plugin
170
+ # @return [Boolean] Whether the plugin was applied
171
+ # @note This is currently only called by Plugins::Cache.
172
+ def apply_plugin(_)
173
+ false
174
+ end
175
+ end
176
+
177
+ Translation = Struct.new(:backend, :locale) do
178
+ %w[read write].each do |accessor|
179
+ define_method accessor do |*args|
180
+ backend.send(accessor, locale, *args)
181
+ end
182
+ end
144
183
  end
145
184
  end
146
185
  end
@@ -8,25 +8,35 @@ Adds {#for} method to backend to return ORM-specific backend.
8
8
  class Post < ActiveRecord::Base
9
9
  # ...
10
10
  end
11
- Mobility::Backend::KeyValue.for(Post)
12
- #=> Mobility::Backend::ActiveRecord::KeyValue
11
+ Mobility::Backends::KeyValue.for(Post)
12
+ #=> Mobility::Backends::ActiveRecord::KeyValue
13
13
 
14
14
  =end
15
15
  module OrmDelegator
16
16
  # @param [Class] model_class Class of model
17
17
  # @return [Class] Class of backend to use for model
18
18
  def for(model_class)
19
+ namespace = name.split('::'.freeze)
19
20
  if Loaded::ActiveRecord && model_class < ::ActiveRecord::Base
20
- const_get(name.split("::".freeze).insert(-2, "ActiveRecord".freeze).join("::".freeze))
21
+ require_backend("active_record", namespace.last.underscore)
22
+ const_get(namespace.insert(-2, "ActiveRecord".freeze).join("::".freeze))
21
23
  elsif Loaded::Sequel && model_class < ::Sequel::Model
22
- const_get(name.split("::".freeze).insert(-2, "Sequel".freeze).join("::".freeze))
24
+ require_backend("sequel", namespace.last.underscore)
25
+ const_get(namespace.insert(-2, "Sequel".freeze).join("::".freeze))
23
26
  else
24
- raise ArgumentError, "#{name.split('::'.freeze).last} backend can only be used by ActiveRecord or Sequel models".freeze
27
+ raise ArgumentError, "#{namespace.last} backend can only be used by ActiveRecord or Sequel models".freeze
25
28
  end
26
29
  end
27
30
 
28
- def self.included(base)
29
- base.extend(self)
31
+ private
32
+
33
+ def require_backend(orm, backend)
34
+ begin
35
+ orm_backend = "mobility/backends/#{orm}/#{backend}"
36
+ require orm_backend
37
+ rescue LoadError => e
38
+ raise unless e.message =~ /#{orm_backend}/
39
+ end
30
40
  end
31
41
  end
32
42
  end
@@ -0,0 +1,18 @@
1
+ module Mobility
2
+ module Backend
3
+ =begin
4
+
5
+ Module which stringifies the locale passed in to read and write methods.
6
+
7
+ =end
8
+ module StringifyLocale
9
+ def read(locale, options = {})
10
+ super(locale.to_s, options)
11
+ end
12
+
13
+ def write(locale, value, options = {})
14
+ super(locale.to_s, value, options)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -13,15 +13,15 @@ Resets backend cache when reset events occur.
13
13
 
14
14
  =end
15
15
  class BackendResetter < Module
16
- # @param [Array<String>] attributes Attributes whose backends should be reset
16
+ # @param [Array<String>] attribute_names Names of attributes whose backends should be reset
17
17
  # @yield Backend to reset as context for block
18
18
  # @raise [ArgumentError] if no block is provided.
19
- def initialize(attributes, &block)
19
+ def initialize(attribute_names, &block)
20
20
  raise ArgumentError, "block required" unless block_given?
21
21
  @model_reset_method = Proc.new do
22
- attributes.each do |attribute|
23
- if @mobility_backends && @mobility_backends[attribute]
24
- @mobility_backends[attribute].instance_eval(&block)
22
+ attribute_names.each do |name|
23
+ if @mobility_backends && @mobility_backends[name]
24
+ @mobility_backends[name].instance_eval(&block)
25
25
  end
26
26
  end
27
27
  end
@@ -31,10 +31,13 @@ Resets backend cache when reset events occur.
31
31
  # @param [Class] model_class Class of model to which backend resetter will be applied
32
32
  def self.for(model_class)
33
33
  if Loaded::ActiveRecord && model_class < ::ActiveRecord::Base
34
+ require "mobility/active_record/backend_resetter"
34
35
  ActiveRecord::BackendResetter
35
36
  elsif Loaded::ActiveRecord && model_class.ancestors.include?(::ActiveModel::Dirty)
37
+ require "mobility/active_model/backend_resetter"
36
38
  ActiveModel::BackendResetter
37
39
  elsif Loaded::Sequel && model_class < ::Sequel::Model
40
+ require "mobility/sequel/backend_resetter"
38
41
  Sequel::BackendResetter
39
42
  else
40
43
  self
@@ -0,0 +1,4 @@
1
+ module Mobility
2
+ module Backends
3
+ end
4
+ end
@@ -0,0 +1,20 @@
1
+ module Mobility
2
+ module Backends
3
+ module ActiveRecord
4
+ def setup_query_methods(query_methods)
5
+ setup do |attributes, options|
6
+ extend(Module.new do
7
+ define_method ::Mobility.query_method do
8
+ super().extending(query_methods.new(attributes, options))
9
+ end
10
+ end)
11
+ end
12
+ end
13
+
14
+ def self.included(backend_class)
15
+ backend_class.include(Backend)
16
+ backend_class.extend(self)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,8 +1,11 @@
1
+ require "mobility/backends/active_record"
2
+ require "mobility/backends/column"
3
+
1
4
  module Mobility
2
- module Backend
5
+ module Backends
3
6
  =begin
4
7
 
5
- Implements the {Mobility::Backend::Column} backend for ActiveRecord models.
8
+ Implements the {Mobility::Backends::Column} backend for ActiveRecord models.
6
9
 
7
10
  You can use the +mobility:translations+ generator to create a migration adding
8
11
  translatable columns to the model table with:
@@ -13,9 +16,6 @@ The generated migration will add columns +title_<locale>+ for every locale in
13
16
  +I18n.available_locales+. (The generator can be run again to add new attributes
14
17
  or locales.)
15
18
 
16
- @note This backend disables the +locale_accessors+ option, which would
17
- otherwise interfere with column methods.
18
-
19
19
  @example
20
20
  class Post < ActiveRecord::Base
21
21
  translates :title, backend: :column
@@ -32,27 +32,39 @@ or locales.)
32
32
  include ActiveRecord
33
33
  include Column
34
34
 
35
- require 'mobility/backend/active_record/column/query_methods'
35
+ require 'mobility/backends/active_record/column/query_methods'
36
36
 
37
37
  # @!group Backend Accessors
38
38
  # @!macro backend_reader
39
- def read(locale, **_)
39
+ def read(locale, _ = {})
40
40
  model.read_attribute(column(locale))
41
41
  end
42
42
 
43
- # @!group Backend Accessors
44
43
  # @!macro backend_writer
45
- def write(locale, value, **_)
44
+ def write(locale, value, _ = {})
46
45
  model.send(:write_attribute, column(locale), value)
47
46
  end
47
+ # @!endgroup
48
48
 
49
- # @!group Backend Configuration
50
- def self.configure(options)
51
- options[:locale_accessors] = false
49
+ # @!macro backend_iterator
50
+ def each_locale
51
+ available_locales.each { |l| yield(l) if present?(l) }
52
52
  end
53
- # @!endgroup
54
53
 
55
54
  setup_query_methods(QueryMethods)
55
+
56
+ private
57
+
58
+ def available_locales
59
+ @available_locales ||= get_column_locales
60
+ end
61
+
62
+ def get_column_locales
63
+ column_name_regex = /\A#{attribute}_([a-z]{2}(_[a-z]{2})?)\z/.freeze
64
+ model.class.columns.map do |c|
65
+ (match = c.name.match(column_name_regex)) && match[1].to_sym
66
+ end.compact
67
+ end
56
68
  end
57
69
  end
58
70
  end
@@ -1,7 +1,9 @@
1
+ require "mobility/backends/active_record/query_methods"
2
+
1
3
  module Mobility
2
- module Backend
3
- class ActiveRecord::Column::QueryMethods < Backend::ActiveRecord::QueryMethods
4
- def initialize(attributes, **options)
4
+ module Backends
5
+ class ActiveRecord::Column::QueryMethods < ActiveRecord::QueryMethods
6
+ def initialize(attributes, _)
5
7
  super
6
8
  attributes_extractor = @attributes_extractor
7
9
  @opts_converter = opts_converter = lambda do |opts|
@@ -0,0 +1,29 @@
1
+ require 'mobility/backends/active_record/pg_hash'
2
+
3
+ module Mobility
4
+ module Backends
5
+ =begin
6
+
7
+ Implements the {Mobility::Backends::Hstore} backend for ActiveRecord models.
8
+
9
+ @see Mobility::Backends::ActiveRecord::HashValued
10
+
11
+ =end
12
+ class ActiveRecord::Hstore < ActiveRecord::PgHash
13
+ require 'mobility/backends/active_record/hstore/query_methods'
14
+
15
+ # @!group Backend Accessors
16
+ # @!macro backend_reader
17
+ # @!method read(locale, **options)
18
+
19
+ # @!group Backend Accessors
20
+ # @!macro backend_writer
21
+ def write(locale, value, options = {})
22
+ super(locale, value && value.to_s, options)
23
+ end
24
+ # @!endgroup
25
+
26
+ setup_query_methods(QueryMethods)
27
+ end
28
+ end
29
+ end
@@ -1,7 +1,7 @@
1
1
  module Mobility
2
- module Backend
2
+ module Backends
3
3
  class ActiveRecord::Hstore::QueryMethods < ActiveRecord::QueryMethods
4
- def initialize(attributes, **)
4
+ def initialize(attributes, _)
5
5
  super
6
6
  attributes_extractor = @attributes_extractor
7
7
 
@@ -1,16 +1,16 @@
1
- require 'mobility/backend/active_record/hash_valued'
1
+ require 'mobility/backends/active_record/pg_hash'
2
2
 
3
3
  module Mobility
4
- module Backend
4
+ module Backends
5
5
  =begin
6
6
 
7
- Implements the {Mobility::Backend::Jsonb} backend for ActiveRecord models.
7
+ Implements the {Mobility::Backends::Jsonb} backend for ActiveRecord models.
8
8
 
9
- @see Mobility::Backend::ActiveRecord::HashValued
9
+ @see Mobility::Backends::ActiveRecord::HashValued
10
10
 
11
11
  =end
12
- class ActiveRecord::Jsonb < ActiveRecord::HashValued
13
- require 'mobility/backend/active_record/jsonb/query_methods'
12
+ class ActiveRecord::Jsonb < ActiveRecord::PgHash
13
+ require 'mobility/backends/active_record/jsonb/query_methods'
14
14
 
15
15
  # @!group Backend Accessors
16
16
  #
@@ -1,7 +1,9 @@
1
+ require "mobility/backends/active_record/query_methods"
2
+
1
3
  module Mobility
2
- module Backend
4
+ module Backends
3
5
  class ActiveRecord::Jsonb::QueryMethods < ActiveRecord::QueryMethods
4
- def initialize(attributes, **)
6
+ def initialize(attributes, _)
5
7
  super
6
8
  attributes_extractor = @attributes_extractor
7
9