activerecord-filter 1.0.0 → 1.0.1
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
- data/README.md +63 -2
- data/ext/active_record/base.rb +17 -4
- data/ext/arel/visitors/postgresql.rb +8 -1
- data/lib/active_record/filter/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e58dc2beee5f882a7ffc33cbedd1af29badedfb8
|
4
|
+
data.tar.gz: 1ae2e957182bac436a0416e522b5ca65e92122c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d3f3fbbc571cccfee96bf9fdcd765d36325232d03898177fd8f6cc065682d6a610524e520087de2a6fb20203728c2dca01d03fc1abe752119814f7d6f8708fa
|
7
|
+
data.tar.gz: 1db8ff73b59f396551fd1eca0687a5ef940cf533f744e0b3b7b8f098e0c64664ddc1d5261256ed97bc810917e84e4885a2304f8d863ba8c04958ce16cfcfac20
|
data/README.md
CHANGED
@@ -1,2 +1,63 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# ActiveRecord::filter
|
2
|
+
|
3
|
+
`ActiveRecord::filter` provides and easy way to accept user input and filter a query by the input.
|
4
|
+
|
5
|
+
Installtion
|
6
|
+
-----------
|
7
|
+
|
8
|
+
- Add `gem 'activerecord-filter', require: 'active_record/filter'
|
9
|
+
- Run `bundle install`
|
10
|
+
|
11
|
+
Examples
|
12
|
+
--------
|
13
|
+
|
14
|
+
Normal columns:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
Property.filter(:id => 5).to_sql
|
18
|
+
# => "...WHERE properties.id = 5"
|
19
|
+
|
20
|
+
Property.filter(:id => [5, 10, 15]).to_sql
|
21
|
+
# => "...WHERE properties.id IN (5, 10, 15)"
|
22
|
+
|
23
|
+
Property.filter(:id => {:gt => 5}).to_sql
|
24
|
+
# => "...WHERE properties.id > 5"
|
25
|
+
|
26
|
+
Property.filter(:id => {:gte => 5}).to_sql
|
27
|
+
# => "...WHERE properties.id >= 5"
|
28
|
+
|
29
|
+
Property.filter(:id => {:lt => 5}).to_sql
|
30
|
+
# => "...WHERE properties.id < 5"
|
31
|
+
|
32
|
+
Property.filter(:id => {:lte => 5}).to_sql
|
33
|
+
# => "...WHERE properties.id <= 5"
|
34
|
+
|
35
|
+
Property.filter(:address_id => nil).to_sql
|
36
|
+
# => "...WHERE properties.address_id IS NULL..."
|
37
|
+
|
38
|
+
Property.filter(:address_id => false).to_sql
|
39
|
+
# => "...WHERE properties.address_id IS NULL..."
|
40
|
+
|
41
|
+
Property.filter(:address_id => true).to_sql
|
42
|
+
# => "...WHERE properties.address_id IS NOT NULL..."
|
43
|
+
```
|
44
|
+
|
45
|
+
It can also work with array columns:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
Property.filter(:tags => 'Skyscraper').to_sql
|
49
|
+
# => "...WHERE 'Skyscraper' = ANY(properties.tags)..."
|
50
|
+
|
51
|
+
Property.filter(:tags => ['Skyscraper', 'Brick']).to_sql
|
52
|
+
# => "...WHERE (properties.aliases && '{"Skyscraper", "Brick"}')..."
|
53
|
+
```
|
54
|
+
It can also sort on relations:
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
Photo.filter(:property => 10).to_sql
|
58
|
+
# => "...WHERE photos.property_id = 5"
|
59
|
+
|
60
|
+
Photo.filter(:property => {name: 'Empire State'}).to_sql
|
61
|
+
# => "...INNER JOIN properties ON properties.id = photos.property_id
|
62
|
+
# => " WHERE properties.name = 'Empire State'"
|
63
|
+
```
|
data/ext/active_record/base.rb
CHANGED
@@ -134,7 +134,6 @@ class ActiveRecord::Base
|
|
134
134
|
when nil
|
135
135
|
where(table[column].eq(nil))
|
136
136
|
else
|
137
|
-
puts value.inspect
|
138
137
|
raise 'Not supported'
|
139
138
|
end
|
140
139
|
end
|
@@ -143,8 +142,21 @@ class ActiveRecord::Base
|
|
143
142
|
table = options[:table_alias] ? arel_table.alias(options[:table_alias]) : arel_table
|
144
143
|
|
145
144
|
case value
|
145
|
+
when Hash
|
146
|
+
resource = all
|
147
|
+
value.each_pair do |key, value|
|
148
|
+
resource = case key.to_sym
|
149
|
+
when :contains
|
150
|
+
resource.where(Arel::Nodes::Contains.new(table[column], Arel::Attributes::Array.new(value)))
|
151
|
+
when :overlaps
|
152
|
+
resource.where(Arel::Nodes::Overlaps.new(table[column], Arel::Attributes::Array.new(value)))
|
153
|
+
else
|
154
|
+
raise "Not Supported: #{key.to_sym}"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
resource
|
146
158
|
when Array
|
147
|
-
where(Arel::Nodes::
|
159
|
+
where(Arel::Nodes::Contains.new(table[column], Arel::Attributes::Array.new(value)))
|
148
160
|
else
|
149
161
|
any_column = Arel::Nodes::NamedFunction.new('ANY', [table[column]])
|
150
162
|
predicate = Arel::Nodes::Equality.new(Arel::Nodes.build_quoted(value), any_column)
|
@@ -226,13 +238,14 @@ class ActiveRecord::Base
|
|
226
238
|
when Hash
|
227
239
|
if relation.polymorphic?
|
228
240
|
raise 'no :as' if !value[:as]
|
229
|
-
|
241
|
+
v = value.dup
|
242
|
+
klass = v.delete(:as).classify.constantize
|
230
243
|
t1 = resource.arel_table
|
231
244
|
t2 = klass.arel_table
|
232
245
|
resource = resource.joins(t1.join(t2).on(
|
233
246
|
t2[:id].eq(t1["#{relation.name}_id"]).and(t1["#{relation.name}_type"].eq(klass.name))
|
234
247
|
).join_sources.first)
|
235
|
-
resource = resource.merge(klass.filter(
|
248
|
+
resource = resource.merge(klass.filter(v))
|
236
249
|
else
|
237
250
|
resource = resource.joins(relation.name) # if !resource.references?(relation.name)
|
238
251
|
resource = resource.merge(relation.klass.filter(value))
|
@@ -19,7 +19,14 @@ module Arel
|
|
19
19
|
type = if !o.relation[0]
|
20
20
|
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array.new(nil)
|
21
21
|
else
|
22
|
-
|
22
|
+
# TODO: temp fix, need to figure out how to look up ruby type ->
|
23
|
+
# postgres type or use the column we're quering on...
|
24
|
+
dt = if o.relation[0].class == Fixnum
|
25
|
+
dt = "Integer"
|
26
|
+
else
|
27
|
+
o.relation[0].class
|
28
|
+
end
|
29
|
+
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array.new("ActiveRecord::Type::#{dt}".constantize.new)
|
23
30
|
end
|
24
31
|
|
25
32
|
collector << quote(type.type_cast_for_database(o.relation))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|