json_sti 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/json_sti.rb +81 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 319641335350e77309eff235ae18303ba23e9b070c970e1ee2b4be720738f074
|
4
|
+
data.tar.gz: a036eb392df3c055cd8bd0d5ec393388fbaeec059bb351790fb91d0a981eb49f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89462fc1261e0edebc90081b6fff6389b22afeb167728169c40fe0c77dcd55979ab12f0e702e600d02a113f7258850700b720c1262fe54f544286472ad425902
|
7
|
+
data.tar.gz: 8ed7f497df0c3f6b90fc3cad86f577a591385c9514f959678694f27485487b8df5d91fd8abc5a6c86248ccbae59d95e39aabaa5cef37a37e70e1559f5eba8ae3
|
data/lib/json_sti.rb
CHANGED
@@ -63,8 +63,18 @@ module JsonSti
|
|
63
63
|
schema: lambda { self.class::SCHEMA }
|
64
64
|
}
|
65
65
|
|
66
|
+
# handles bug in ransackable where 1 is converted to true
|
67
|
+
def self.clean_val_aa(val)
|
68
|
+
val.is_a?(TrueClass) ? 1 : val
|
69
|
+
end
|
70
|
+
|
66
71
|
# a helper similar to ARs `where` only for json fields
|
67
|
-
scope :
|
72
|
+
scope :j_where, lambda { |hash| where("module_data @> ?", hash.to_json) }
|
73
|
+
scope :j_like_key, lambda { |key, value| where("module_data ->> :key LIKE :value",key: key, value: "%#{value}%") }
|
74
|
+
scope :j_gt, lambda { |prop, val| where("module_data ->> '#{prop}' > ?", "#{clean_val_aa(val).to_f}") }
|
75
|
+
scope :j_lt, lambda { |prop, val| where("module_data ->> '#{prop}' < ?", "#{clean_val_aa(val).to_f}" ) }
|
76
|
+
scope :j_gte, lambda { |prop, val| where("module_data ->> '#{prop}' >= ?", "#{clean_val_aa(val).to_f}") }
|
77
|
+
scope :j_lte, lambda { |prop, val| where("module_data ->> '#{prop}' <= ?", "#{clean_val_aa(val).to_f}" ) }
|
68
78
|
|
69
79
|
def initialize(params)
|
70
80
|
super
|
@@ -79,7 +89,6 @@ module JsonSti
|
|
79
89
|
end
|
80
90
|
end
|
81
91
|
end
|
82
|
-
|
83
92
|
end
|
84
93
|
end
|
85
94
|
|
@@ -101,6 +110,76 @@ module JsonSti
|
|
101
110
|
|
102
111
|
initialize_attr_getters(json_attrs.keys)
|
103
112
|
initialize_attr_setters(json_attrs.keys)
|
113
|
+
|
114
|
+
#creates methods required for ransackables searches in active admin
|
115
|
+
class << self
|
116
|
+
self.class_variable_get(:@@json_attrs).each do |prop, type|
|
117
|
+
if type["type"].include?("string")
|
118
|
+
define_method "#{prop}_equals" do |value|
|
119
|
+
self.j_where(Hash[prop, value])
|
120
|
+
end
|
121
|
+
|
122
|
+
define_method "#{prop}_contains" do |value|
|
123
|
+
self.j_like_key(prop, value)
|
124
|
+
end
|
125
|
+
elsif type["type"].include?("integer")
|
126
|
+
define_method "#{prop}_equals" do |value|
|
127
|
+
self.j_where(Hash[prop, value.to_i])
|
128
|
+
end
|
129
|
+
|
130
|
+
define_method "#{prop}_greater_than" do |value|
|
131
|
+
self.j_gt(prop, value)
|
132
|
+
end
|
133
|
+
|
134
|
+
define_method "#{prop}_less_than" do |value|
|
135
|
+
self.j_lt(prop, value)
|
136
|
+
end
|
137
|
+
elsif type["type"].include?("number")
|
138
|
+
define_method "#{prop}_equals" do |value|
|
139
|
+
self.j_where(Hash[prop, clean_val_aa(value).to_f])
|
140
|
+
end
|
141
|
+
|
142
|
+
define_method "#{prop}_greater_than" do |value|
|
143
|
+
self.j_gt(prop, value)
|
144
|
+
end
|
145
|
+
|
146
|
+
define_method "#{prop}_less_than" do |value|
|
147
|
+
self.j_lt(prop, value)
|
148
|
+
end
|
149
|
+
elsif type["type"].include?("boolean")
|
150
|
+
# todo figure this out in for select, eq for checkboxes or viceversa
|
151
|
+
# define_method "#{prop}_in" do |*value|
|
152
|
+
# self.j_where(Hash[prop, value])
|
153
|
+
# end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
define_method "ransackable_scopes" do |_auth_object = nil|
|
158
|
+
scopes = []
|
159
|
+
|
160
|
+
ransackable_string_query_types = %i(equals contains)
|
161
|
+
self.class_variable_get(:@@json_attrs).each do |prop, type|
|
162
|
+
if type["type"].include?("string")
|
163
|
+
ransackable_string_query_types.each do |ransackable_query_type|
|
164
|
+
scopes.push "#{prop}_#{ransackable_query_type}"
|
165
|
+
end
|
166
|
+
elsif type["type"].include?("integer")
|
167
|
+
scopes.push "#{prop}_equals"
|
168
|
+
scopes.push "#{prop}_greater_than"
|
169
|
+
scopes.push "#{prop}_less_than"
|
170
|
+
elsif type["type"].include?("number")
|
171
|
+
scopes.push "#{prop}_equals"
|
172
|
+
scopes.push "#{prop}_greater_than"
|
173
|
+
scopes.push "#{prop}_less_than"
|
174
|
+
elsif type["type"].include?("boolean")
|
175
|
+
# todo figure this out in for select, eq for checkboxes or viceversa
|
176
|
+
# scopes.push "#{prop}_in"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
scopes
|
181
|
+
end
|
182
|
+
end
|
104
183
|
end
|
105
184
|
end
|
106
185
|
|