trailblazer-finder 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +160 -11
  3. data/CHANGES.md +5 -0
  4. data/README.md +93 -22
  5. data/lib/trailblazer/finder.rb +3 -0
  6. data/lib/trailblazer/finder/adapters/active_record.rb +4 -0
  7. data/lib/trailblazer/finder/adapters/active_record/predicates.rb +42 -0
  8. data/lib/trailblazer/finder/adapters/friendly_id.rb +22 -24
  9. data/lib/trailblazer/finder/adapters/sequel.rb +5 -0
  10. data/lib/trailblazer/finder/adapters/sequel/predicates.rb +43 -0
  11. data/lib/trailblazer/finder/base.rb +3 -3
  12. data/lib/trailblazer/finder/features.rb +1 -0
  13. data/lib/trailblazer/finder/features/predicate.rb +37 -0
  14. data/lib/trailblazer/finder/filter.rb +2 -2
  15. data/lib/trailblazer/finder/predicates.rb +39 -0
  16. data/lib/trailblazer/finder/utils/deep_locate.rb +45 -0
  17. data/lib/trailblazer/finder/utils/extra.rb +1 -1
  18. data/lib/trailblazer/finder/utils/splitter.rb +42 -0
  19. data/lib/trailblazer/finder/version.rb +1 -1
  20. data/spec/spec_helper_sequel.rb +1 -0
  21. data/spec/trailblazer/finder/adapters/active_record/base_spec.rb +1 -1
  22. data/spec/trailblazer/finder/adapters/active_record/predicates_spec.rb +98 -0
  23. data/spec/trailblazer/finder/adapters/active_record/sorting_spec.rb +4 -0
  24. data/spec/trailblazer/finder/adapters/data_mapper/base_spec.rb +1 -1
  25. data/spec/trailblazer/finder/adapters/sequel/base_spec.rb +1 -1
  26. data/spec/trailblazer/finder/adapters/sequel/predicates_spec.rb +89 -0
  27. data/spec/trailblazer/finder/adapters/sequel/sorting_spec.rb +4 -0
  28. data/spec/trailblazer/finder/features/paging_spec.rb +1 -1
  29. data/spec/trailblazer/finder/features/predicates_spec.rb +99 -0
  30. data/spec/trailblazer/finder/features/sorting_spec.rb +3 -4
  31. data/spec/trailblazer/operation/predicates_spec.rb +127 -0
  32. data/spec/trailblazer/test_spec.rb +41 -0
  33. data/trailblazer-finder.gemspec +0 -2
  34. metadata +17 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5026306e94df40bcd37f944f4c532d2ebd4686d6ee086fff5d1e7e1202cc9f7
4
- data.tar.gz: b05d37c15a0bc5dc704b5883001a004b5c486da722552a870b89bf9f79eb7c73
3
+ metadata.gz: f4608d8c90233e27fe50241948f60646d3b68babc3555357291586f83bad3f6e
4
+ data.tar.gz: 04fd61382d1ba953bbb36f115a7dad6491df8c8b86622593d859b000a16cdf69
5
5
  SHA512:
6
- metadata.gz: b366ef3762c765f0588ed5a9df87c5860ef292fe66bb05d148ca953dd208f53d58eb9bf1ed0816e9723a1da54f2b2e774a7d2f7ecb5a877a3e991878ec9bb0f8
7
- data.tar.gz: f247283b226cd2de4f5ea6e1ca51cb0aa03679e295359dc99e85b5ed80260008a055788719fe280ea7f65716f032ec3b96861224a1a671d679650d224a2818b6
6
+ metadata.gz: 7723c58c1ecccad895806fde42004a1b74d478ed87020f0ea022f1e146854909c246cb7bd6e64e0bbc3c7f585a29c4bcb3d351b309bcaaa5f4fa52d581c4f219
7
+ data.tar.gz: 129524c2f2ab3ac5249cdacd941405239a0f1389534b7418005e1b31bb8cba712e49df7454257047fa8a0361d1e4e0098dc2e1dafcd2925ffb77363e0a365c1e
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-03-05 19:59:14 +0100 using RuboCop version 0.53.0.
3
+ # on 2018-03-14 21:09:38 +0100 using RuboCop version 0.53.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -8,11 +8,9 @@
8
8
 
9
9
  # Offense count: 1
10
10
  # Cop supports --auto-correct.
11
- # Configuration parameters: Include, TreatCommentsAsGroupSeparators.
12
- # Include: **/*.gemfile, **/Gemfile, **/gems.rb
13
- Bundler/OrderedGems:
11
+ Layout/CommentIndentation:
14
12
  Exclude:
15
- - 'Gemfile'
13
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
16
14
 
17
15
  # Offense count: 1
18
16
  # Cop supports --auto-correct.
@@ -20,14 +18,123 @@ Layout/EmptyLines:
20
18
  Exclude:
21
19
  - 'spec/trailblazer/operation/finder_spec.rb'
22
20
 
23
- # Offense count: 3
21
+ # Offense count: 1
22
+ # Cop supports --auto-correct.
23
+ # Configuration parameters: EnforcedStyle.
24
+ # SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines
25
+ Layout/EmptyLinesAroundModuleBody:
26
+ Exclude:
27
+ - 'lib/trailblazer/finder/adapters/sequel/predicates.rb'
28
+
29
+ # Offense count: 1
30
+ # Cop supports --auto-correct.
31
+ # Configuration parameters: EnforcedStyle.
32
+ # SupportedStyles: normal, rails
33
+ Layout/IndentationConsistency:
34
+ Exclude:
35
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
36
+
37
+ # Offense count: 1
38
+ # Cop supports --auto-correct.
39
+ # Configuration parameters: Width, IgnoredPatterns.
40
+ Layout/IndentationWidth:
41
+ Exclude:
42
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
43
+
44
+ # Offense count: 1
45
+ # Cop supports --auto-correct.
46
+ Layout/SpaceAroundKeyword:
47
+ Exclude:
48
+ - 'spec/trailblazer/finder/features/predicates_spec.rb'
49
+
50
+ # Offense count: 4
51
+ # Cop supports --auto-correct.
52
+ # Configuration parameters: AllowForAlignment.
53
+ Layout/SpaceAroundOperators:
54
+ Exclude:
55
+ - 'spec/trailblazer/finder/features/predicates_spec.rb'
56
+
57
+ # Offense count: 4
58
+ # Cop supports --auto-correct.
59
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
60
+ # SupportedStyles: space, no_space
61
+ # SupportedStylesForEmptyBraces: space, no_space
62
+ Layout/SpaceBeforeBlockBraces:
63
+ Exclude:
64
+ - 'lib/trailblazer/finder/adapters/sequel/predicates.rb'
65
+
66
+ # Offense count: 8
67
+ # Cop supports --auto-correct.
68
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
69
+ # SupportedStyles: space, no_space
70
+ # SupportedStylesForEmptyBraces: space, no_space
71
+ Layout/SpaceInsideBlockBraces:
72
+ Exclude:
73
+ - 'lib/trailblazer/finder/adapters/sequel/predicates.rb'
74
+
75
+ # Offense count: 4
76
+ # Cop supports --auto-correct.
77
+ Layout/SpaceInsideParens:
78
+ Exclude:
79
+ - 'lib/trailblazer/finder/utils/splitter.rb'
80
+
81
+ # Offense count: 5
82
+ # Cop supports --auto-correct.
83
+ Layout/TrailingWhitespace:
84
+ Exclude:
85
+ - 'lib/trailblazer/finder/filter.rb'
86
+ - 'spec/trailblazer/finder/adapters/active_record/base_spec.rb'
87
+ - 'spec/trailblazer/finder/adapters/data_mapper/base_spec.rb'
88
+ - 'spec/trailblazer/finder/adapters/sequel/base_spec.rb'
89
+
90
+ # Offense count: 1
91
+ Lint/DuplicateMethods:
92
+ Exclude:
93
+ - 'lib/trailblazer/finder/utils/splitter.rb'
94
+
95
+ # Offense count: 2
96
+ # Cop supports --auto-correct.
97
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
98
+ Lint/UnusedMethodArgument:
99
+ Exclude:
100
+ - 'lib/trailblazer/finder/adapters/sequel/predicates.rb'
101
+
102
+ # Offense count: 2
103
+ Metrics/AbcSize:
104
+ Max: 18
105
+
106
+ # Offense count: 8
107
+ # Configuration parameters: CountComments.
108
+ Metrics/MethodLength:
109
+ Max: 51
110
+
111
+ # Offense count: 5
24
112
  RSpec/DescribeClass:
25
113
  Exclude:
114
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
26
115
  - 'spec/trailblazer/operation/finder_spec.rb'
27
116
  - 'spec/trailblazer/operation/paging_spec.rb'
117
+ - 'spec/trailblazer/operation/predicates_spec.rb'
28
118
  - 'spec/trailblazer/operation/sorting_spec.rb'
29
119
 
30
- # Offense count: 14
120
+ # Offense count: 40
121
+ # Configuration parameters: CustomTransform, IgnoredWords.
122
+ RSpec/ExampleWording:
123
+ Exclude:
124
+ - 'spec/trailblazer/finder/adapters/active_record/predicates_spec.rb'
125
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
126
+ - 'spec/trailblazer/finder/features/predicates_spec.rb'
127
+ - 'spec/trailblazer/operation/predicates_spec.rb'
128
+
129
+ # Offense count: 2
130
+ # Cop supports --auto-correct.
131
+ # Configuration parameters: EnforcedStyle.
132
+ # SupportedStyles: prefer_alias, prefer_alias_method
133
+ Style/Alias:
134
+ Exclude:
135
+ - 'lib/trailblazer/finder/utils/splitter.rb'
136
+
137
+ # Offense count: 18
31
138
  # Cop supports --auto-correct.
32
139
  # Configuration parameters: AutoCorrect, EnforcedStyle.
33
140
  # SupportedStyles: nested, compact
@@ -35,18 +142,60 @@ Style/ClassAndModuleChildren:
35
142
  Exclude:
36
143
  - 'spec/trailblazer/operation/finder_spec.rb'
37
144
  - 'spec/trailblazer/operation/paging_spec.rb'
145
+ - 'spec/trailblazer/operation/predicates_spec.rb'
38
146
  - 'spec/trailblazer/operation/sorting_spec.rb'
39
147
 
40
- # Offense count: 10
148
+ # Offense count: 1
149
+ # Cop supports --auto-correct.
150
+ Style/IfUnlessModifier:
151
+ Exclude:
152
+ - 'lib/trailblazer/finder/utils/deep_locate.rb'
153
+
154
+ # Offense count: 2
155
+ # Cop supports --auto-correct.
156
+ # Configuration parameters: IncludeSemanticChanges.
157
+ Style/NonNilCheck:
158
+ Exclude:
159
+ - 'lib/trailblazer/finder/predicates.rb'
160
+
161
+ # Offense count: 2
162
+ # Cop supports --auto-correct.
163
+ Style/ParallelAssignment:
164
+ Exclude:
165
+ - 'lib/trailblazer/finder/utils/splitter.rb'
166
+
167
+ # Offense count: 2
168
+ # Cop supports --auto-correct.
169
+ Style/PerlBackrefs:
170
+ Exclude:
171
+ - 'lib/trailblazer/finder/utils/splitter.rb'
172
+
173
+ # Offense count: 160
41
174
  # Cop supports --auto-correct.
42
175
  # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
43
176
  # SupportedStyles: single_quotes, double_quotes
44
177
  Style/StringLiterals:
45
178
  Exclude:
46
- - 'Gemfile'
179
+ - 'lib/trailblazer/finder/adapters/sequel/predicates.rb'
180
+ - 'lib/trailblazer/finder/features/predicate.rb'
181
+ - 'spec/trailblazer/finder/adapters/active_record/predicates_spec.rb'
182
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
183
+ - 'spec/trailblazer/finder/features/predicates_spec.rb'
184
+ - 'spec/trailblazer/operation/predicates_spec.rb'
185
+
186
+ # Offense count: 16
187
+ # Cop supports --auto-correct.
188
+ # Configuration parameters: EnforcedStyle, MinSize, WordRegex.
189
+ # SupportedStyles: percent, brackets
190
+ Style/WordArray:
191
+ Exclude:
192
+ - 'spec/trailblazer/finder/adapters/active_record/predicates_spec.rb'
193
+ - 'spec/trailblazer/finder/adapters/sequel/predicates_spec.rb'
194
+ - 'spec/trailblazer/finder/features/predicates_spec.rb'
195
+ - 'spec/trailblazer/operation/predicates_spec.rb'
47
196
 
48
- # Offense count: 89
197
+ # Offense count: 151
49
198
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
50
199
  # URISchemes: http, https
51
200
  Metrics/LineLength:
52
- Max: 128
201
+ Max: 172
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.1.2
2
+
3
+ * Predicate feature introduced, doesn't work for old datamapper adapter yet. Default predicates covered for now: eq, not_eq, blank, not_blank, lt, lte, gt, gte
4
+ * Removed Hashie as dependency and introduced simple version of deep_locate
5
+
1
6
  # 0.1.1
2
7
 
3
8
  * load options[:model] with result set otherwise loading contracts fails, have to find a nicer solution for this at some point
data/README.md CHANGED
@@ -18,25 +18,27 @@ Description should come here
18
18
  * [Example without Trailblazer](#example-without-trailblazer)
19
19
  * [Example Project](#example-project)
20
20
  * [Features](#features)
21
- * [Paging](#paging)
22
- * [Paging Example](#paging-example)
23
- * [Sorting](#sorting)
24
- * [Sorting Example](#sorting-example)
21
+ * [Predicate](#predicate)
22
+ * [Predicate Example](#predicate-example)
23
+ * [Paging](#paging)
24
+ * [Paging Example](#paging-example)
25
+ * [Sorting](#sorting)
26
+ * [Sorting Example](#sorting-example)
25
27
  * [Adapters](#adapters)
26
- * [Adapters Example](#adapters-example)
27
- * [ActiveRecord](#active_record)
28
+ * [Adapters Example](#adapters-example)
29
+ * [ActiveRecord](#active_record)
28
30
  * [Active Record Example](#active-record-example)
29
- * [DataMapper](#data_mapper)
31
+ * [DataMapper](#data_mapper)
30
32
  * [Data Mapper Example](#data-mapper-example)
31
- * [Sequel](#sequel)
33
+ * [Sequel](#sequel)
32
34
  * [Sequel Example](#sequel-example)
33
- * [Kaminari](#kaminari)
35
+ * [Kaminari](#kaminari)
34
36
  * [Kaminari Example](#kaminari-example)
35
- * [WillPaginate](#will_paginate)
37
+ * [WillPaginate](#will_paginate)
36
38
  * [Will Paginate Example](#will-paginate-example)
37
- * [FriendlyId](#friendly_id)
39
+ * [FriendlyId](#friendly_id)
38
40
  * [Friendly Id Example](#friendly-id-example)
39
- * [Tips & Tricks](#tips--tricks)
41
+ * [Tips & Tricks](#tips--tricks)
40
42
  * [ORM's are not required](#results-shortcut)
41
43
  * [Passing Entity Type as Argument](#passing-entity_type-as-argument)
42
44
  * [Contributing](#contributing)
@@ -59,7 +61,6 @@ Or install it yourself as:
59
61
  $ gem install trailblazer-finder
60
62
 
61
63
  ###
62
- * [Hashie](https://github.com/intridea/hashie) - used to search deep within hashes/arrays
63
64
  * [Trailblazer](https://github.com/trailblazer/trailblazer) - [actually optional, but requires 2.1+](https://github.com/trailblazer/trailblazer-finder#usable-without-trailblazer)
64
65
 
65
66
  ## Usage
@@ -201,7 +202,7 @@ When using this, result[:finder] will be extended with (not available for :singl
201
202
 
202
203
  # params for url generations
203
204
  .params # => filter values
204
- .params active: false # => overwrites the 'active' filter
205
+ .params published: false # => overwrites the 'published' filter
205
206
  ```
206
207
 
207
208
 
@@ -227,20 +228,92 @@ When using this, result will be extended with (not available for :single row)
227
228
 
228
229
  # params for url generations
229
230
  .params # => filter values
230
- .params active: false # => overwrites the 'active' filter
231
+ .params published: false # => overwrites the 'published' filter
231
232
  ```
232
233
 
233
234
  ### Example Project
234
235
  Coming soon!
235
236
 
236
237
  ## Features
237
- Aside of the default filtering behaviour, it offers the following optional features as well.
238
+ Aside of the default filtering behavior, it offers the following optional features as well.
238
239
 
239
240
  NOTE: FEATURES NEED TO BE SPECIFIED ON TOP OF YOUR CLASS
240
241
 
241
- ### Paging
242
+ ### Predicate
243
+ Simple predicate feature, that enables you to have default predicate filters available for the specified fields.
244
+
245
+ At the moment we support:
246
+ - eq: equals to
247
+ - not_eq: not equals to
248
+ - blank: blank (empty/nil/nul)
249
+ - not_blank: not blank (empty/nil/null)
250
+ - lt: less than (value converts to float)
251
+ - lte: less than or equal to (value converts to float)
252
+ - gt: greater than (value converts to float)
253
+ - gte: greater than or equal to (value converts to float)
254
+
255
+ NOTE: PREDICATES CURRENTLY DO NOT WORK FOR THE OLD DATAMAPPER ADAPTER
256
+
257
+ #### Predicate Example
258
+ ```ruby
259
+ class Post::Finder < Trailblazer::Finder
260
+ features Predicate
261
+
262
+ # Specify the fields you want predicates enabled for, mind you these fields need to exist on your entity_type
263
+ predicates_for :name, :category_name
264
+
265
+ filter_by :name
266
+ filter_by :published
267
+ filter_by :category_name
268
+
269
+ # per page defaults to 25 (so not required)
270
+ per_page 10
271
+
272
+ # Minimum items per page (not required)
273
+ min_per_page 5
274
+
275
+ # Maximum items per page (not required)
276
+ max_per_page 100
277
+ end
278
+ ```
279
+
280
+ This feature extends the result[:finder] object with the following methods
281
+ ```ruby
282
+ # accessing filters
283
+ .name # => name filter
284
+ .created_at # => created at filter
285
+
286
+ # Predicate filters
287
+ .name_eq # => name equals filter
288
+ .name_not_eq # => name not equals filter
289
+ .name_blank # => name blank filter
290
+ .name_not_blank # => name not blank filter
291
+ .name_lt # => name less than filter (converts value to float)
292
+ .name_lte # => name less than or equal to filter (converts value to float)
293
+ .name_gt # => name greater than filter (converts value to float)
294
+ .name_gte # => name greater than or equal to filter (converts value to float)
295
+ .category_name_eq # => category name equals filter
296
+ .category_name_not_eq # => category name not equals filter
297
+ .category_name_blank # => category name blank filter
298
+ .category_name_not_blank # => category name not blank filter
299
+ .category_name_lt # => category name less than filter (converts value to float)
300
+ .category_name_lte # => category name less than or equal to filter (converts value to float)
301
+ .category_name_gt # => category name greater than filter (converts value to float)
302
+ .category_name_gte # => category name greater than or equal to filter (converts value to float)
303
+
304
+ # accessing results
305
+ .count # => number of found results
306
+ .results? # => are there any results found
307
+ .results # => fetched results
308
+ .all # => if needed, use it to get dataset (sequel for example requires you use it in some cases)
309
+
310
+ # params for url generations
311
+ .params # => filter values
312
+ .params published: false # => overwrites the 'published' filter
313
+ ```
242
314
 
243
- Really simple pagination plugin, which uses the plain ```.limit``` and ```.offset``` methods.
315
+ ### Paging
316
+ Really simple pagination feature, which uses the plain ```.limit``` and ```.offset``` methods.
244
317
 
245
318
  #### Paging Example
246
319
  ```ruby
@@ -268,10 +341,8 @@ This feature extends the result[:finder] object with the following methods
268
341
  .results # => paginated page results
269
342
  ```
270
343
 
271
- ### Sorting Plugin
272
-
273
- Fixing the pain of dealing with sorting attributes and directions.
274
-
344
+ ### Sorting
345
+ Really simple sorting feature, fixing the pain of dealing with sorting attributes and directions. For the moment only sorting by a single attribute works, we're working on making it possible to sort by multiple attributes.
275
346
 
276
347
  #### Sorting Example
277
348
  ```ruby
@@ -9,11 +9,14 @@ require 'trailblazer/finder/utils/params'
9
9
  require 'trailblazer/finder/utils/parse'
10
10
  require 'trailblazer/finder/utils/string'
11
11
  require 'trailblazer/finder/utils/extra'
12
+ require 'trailblazer/finder/utils/splitter'
13
+ require 'trailblazer/finder/utils/deep_locate'
12
14
  require 'trailblazer/finder/base'
13
15
  require 'trailblazer/finder/find'
14
16
  require 'trailblazer/finder/filter'
15
17
  require 'trailblazer/finder/features'
16
18
  require 'trailblazer/finder/adapters'
19
+ require 'trailblazer/finder/predicates'
17
20
 
18
21
  # :nocov:
19
22
  require 'trailblazer/operation/finder' if Gem.loaded_specs.key?('trailblazer')
@@ -1,5 +1,6 @@
1
1
  require 'trailblazer/finder/adapters/active_record/paging'
2
2
  require 'trailblazer/finder/adapters/active_record/sorting'
3
+ require 'trailblazer/finder/adapters/active_record/predicates'
3
4
 
4
5
  module Trailblazer
5
6
  class Finder
@@ -8,6 +9,9 @@ module Trailblazer
8
9
  module ActiveRecord
9
10
  def self.included(base)
10
11
  base.extend ClassMethods
12
+ base.instance_eval do
13
+ include ActiveRecord::Predicates if defined?(Features::Predicate::ClassMethods)
14
+ end
11
15
  end
12
16
 
13
17
  module ClassMethods
@@ -0,0 +1,42 @@
1
+ module Trailblazer
2
+ class Finder
3
+ module Adapters
4
+ module ActiveRecord
5
+ # ActiveRecord - Predicate Adapter
6
+ module Predicates
7
+ def not_eq(attribute, value, entity_type)
8
+ entity_type.where.not(attribute => value)
9
+ end
10
+
11
+ def eq(attribute, value, entity_type)
12
+ entity_type.where(attribute => value)
13
+ end
14
+
15
+ def blank(attribute, _value, entity_type)
16
+ entity_type.where(attribute.to_sym => [nil, ''])
17
+ end
18
+
19
+ def not_blank(attribute, _value, entity_type)
20
+ entity_type.where.not(attribute.to_sym => [nil, ''])
21
+ end
22
+
23
+ def gt(attribute, value, entity_type)
24
+ entity_type.where(["#{attribute} > ?", value.to_f])
25
+ end
26
+
27
+ def gte(attribute, value, entity_type)
28
+ entity_type.where(["#{attribute} >= ?", value.to_f])
29
+ end
30
+
31
+ def lt(attribute, value, entity_type)
32
+ entity_type.where(["#{attribute} < ?", value.to_f])
33
+ end
34
+
35
+ def lte(attribute, value, entity_type)
36
+ entity_type.where(["#{attribute} <= ?", value.to_f])
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end