ransack_query 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -12
- data/lib/grouping.rb +7 -3
- data/lib/ransack_query/version.rb +1 -1
- data/lib/ransack_query.rb +1 -2
- data/spec/factories/grouping.rb +6 -1
- data/spec/factories/hash.rb +37 -3
- data/spec/models/grouping_spec.rb +23 -1
- data/spec/models/ransack_query_spec.rb +3 -14
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba83db8ce90749467d06d5dd8bc18813b6f8103e
|
4
|
+
data.tar.gz: 04bd58590bd3725568971bec161f328263994f59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddc574e4fdd3f6bdadcf020ec743aaa5a13d83faed21ba824a61594296c5d8b3fbdb8c9ed82718264fda34b55dac34bd9b7503ecbbc86cf7542b3d3e86b2ec56
|
7
|
+
data.tar.gz: 2ea8de2fc4ba1334ddb7708713226d1d68bb92c4382a86a553bad5288d30e39d60c0738a19f2bf63a13512c55238565c0f7b50c57a01b374b28f8723fc584b44
|
data/README.md
CHANGED
@@ -26,27 +26,23 @@ Simple Usage:
|
|
26
26
|
grouping.add_condition(Condition.new(attribute: 'first_name', value: 'Bob'))
|
27
27
|
grouping.add_condition(Condition.new(attribute: 'last_name', value: 'Smith', predicate: :not_eq))
|
28
28
|
end
|
29
|
-
and
|
29
|
+
and chainable
|
30
30
|
|
31
31
|
RansackQuery.build do |grouping|
|
32
32
|
grouping.add_condition(Condition.new(attribute: 'first_name', value: 'Bob')).
|
33
33
|
add_condition(Condition.new(attribute: 'last_name', value: 'Smith', predicate: :not_eq))
|
34
34
|
end
|
35
|
-
and
|
35
|
+
and with arrays
|
36
36
|
|
37
37
|
RansackQuery.build do |grouping|
|
38
38
|
conditions = []
|
39
39
|
conditions << Condition.new(attribute: 'first_name', value: 'Bob')
|
40
|
-
conditions << Condition.new
|
41
|
-
condition.attribute = 'last_name'
|
42
|
-
condition.value = 'Smith'
|
43
|
-
condition.predicate = :not_eq
|
44
|
-
end
|
40
|
+
conditions << Condition.new(attribute: 'last_name', value: 'Smith', predicate: :not_eq)
|
45
41
|
grouping.add_conditions(conditions)
|
46
42
|
end
|
47
|
-
and
|
43
|
+
and with blocks
|
48
44
|
|
49
|
-
RansackQuery.build
|
45
|
+
RansackQuery.build do |grouping|
|
50
46
|
grouping.add_condition do |condition|
|
51
47
|
condition.attribute = 'first_name'
|
52
48
|
condition.value = 'Bob'
|
@@ -60,7 +56,7 @@ and
|
|
60
56
|
end
|
61
57
|
|
62
58
|
|
63
|
-
All Produce the following output (with different ids):
|
59
|
+
All Produce the following output in json (with different ids):
|
64
60
|
|
65
61
|
{
|
66
62
|
"g" => {
|
@@ -101,7 +97,7 @@ All Produce the following output (with different ids):
|
|
101
97
|
|
102
98
|
and passing the following options hash to build
|
103
99
|
|
104
|
-
RansackQuery.build(
|
100
|
+
RansackQuery.build(prefix: 'q')
|
105
101
|
|
106
102
|
will produce the following in json
|
107
103
|
|
@@ -229,7 +225,7 @@ Will produce:
|
|
229
225
|
|
230
226
|
## Contributing
|
231
227
|
|
232
|
-
1. Fork it ( https://github.com/
|
228
|
+
1. Fork it ( https://github.com/frank-west-iii/ransack_query/fork )
|
233
229
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
234
230
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
235
231
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/grouping.rb
CHANGED
@@ -42,7 +42,7 @@ class Grouping
|
|
42
42
|
|
43
43
|
def ransackify
|
44
44
|
ransack_hash = {
|
45
|
-
|
45
|
+
group_id => {
|
46
46
|
@id => {
|
47
47
|
'm' => @combinator.to_s
|
48
48
|
}
|
@@ -55,14 +55,18 @@ class Grouping
|
|
55
55
|
|
56
56
|
private
|
57
57
|
|
58
|
+
def group_id
|
59
|
+
"ransack_group_#{id}"
|
60
|
+
end
|
61
|
+
|
58
62
|
def ransackify_conditions(ransack_hash)
|
59
63
|
return if conditions.empty?
|
60
|
-
ransack_hash[
|
64
|
+
ransack_hash[group_id][@id].merge!({'c' => conditions.reduce({}) { |result, condition| result.merge! condition.ransackify }})
|
61
65
|
end
|
62
66
|
|
63
67
|
def ransackify_groupings(ransack_hash)
|
64
68
|
return if groupings.empty?
|
65
|
-
groupings.each {|grouping| ransack_hash[
|
69
|
+
groupings.each { |grouping| ransack_hash[group_id][@id].merge!(grouping.ransackify) }
|
66
70
|
end
|
67
71
|
|
68
72
|
end
|
data/lib/ransack_query.rb
CHANGED
@@ -12,8 +12,7 @@ module RansackQuery
|
|
12
12
|
end
|
13
13
|
ransack_hash = grouping.ransackify
|
14
14
|
ransack_hash = {options[:prefix] => ransack_hash} if options[:prefix]
|
15
|
-
ransack_hash
|
16
|
-
ransack_hash
|
15
|
+
ransack_hash.to_json.gsub(/"ransack_group.*?"/, '"g"')
|
17
16
|
end
|
18
17
|
|
19
18
|
def self.generate_id
|
data/spec/factories/grouping.rb
CHANGED
@@ -7,7 +7,12 @@ FactoryGirl.define do
|
|
7
7
|
trait :complex do
|
8
8
|
combinator :or
|
9
9
|
after(:build) do |obj|
|
10
|
-
|
10
|
+
grouping = FactoryGirl.build(:grouping, :with_conditions)
|
11
|
+
grouping.id = 2
|
12
|
+
obj.add_grouping(grouping)
|
13
|
+
grouping = FactoryGirl.build(:grouping, :with_conditions)
|
14
|
+
grouping.id = 3
|
15
|
+
obj.add_grouping(grouping)
|
11
16
|
end
|
12
17
|
end
|
13
18
|
|
data/spec/factories/hash.rb
CHANGED
@@ -26,10 +26,10 @@ FactoryGirl.define do
|
|
26
26
|
skip_create
|
27
27
|
initialize_with {
|
28
28
|
{
|
29
|
-
'
|
29
|
+
'ransack_group_1' => {
|
30
30
|
1 => {
|
31
31
|
'm' => 'or',
|
32
|
-
'
|
32
|
+
'ransack_group_2' => {
|
33
33
|
2 => {
|
34
34
|
'm' => 'and',
|
35
35
|
'c' => {
|
@@ -61,10 +61,44 @@ FactoryGirl.define do
|
|
61
61
|
}
|
62
62
|
}
|
63
63
|
}
|
64
|
+
},
|
65
|
+
'ransack_group_3' => {
|
66
|
+
3 => {
|
67
|
+
'm' => 'and',
|
68
|
+
'c' => {
|
69
|
+
2 => {
|
70
|
+
'a' => {
|
71
|
+
'0' => {
|
72
|
+
'name' => 'first_name'
|
73
|
+
}
|
74
|
+
},
|
75
|
+
'p' => 'eq',
|
76
|
+
'v' => {
|
77
|
+
'0' => {
|
78
|
+
'value' => 'Bob'
|
79
|
+
}
|
80
|
+
}
|
81
|
+
},
|
82
|
+
3 => {
|
83
|
+
'a' => {
|
84
|
+
'0' => {
|
85
|
+
'name' => 'last_name'
|
86
|
+
}
|
87
|
+
},
|
88
|
+
'p' => 'eq',
|
89
|
+
'v' => {
|
90
|
+
'0' => {
|
91
|
+
'value' => 'Smith'
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
64
97
|
}
|
65
98
|
}
|
66
99
|
}
|
67
|
-
}
|
100
|
+
}
|
101
|
+
}
|
68
102
|
end
|
69
103
|
|
70
104
|
end
|
@@ -39,6 +39,28 @@ describe Grouping do
|
|
39
39
|
subject.groupings.size.should eq 2
|
40
40
|
end
|
41
41
|
|
42
|
+
it 'should allow adding groupings without chaining' do
|
43
|
+
subject.add_grouping(Grouping.new)
|
44
|
+
subject.add_grouping(Grouping.new)
|
45
|
+
subject.groupings.size.should eq 2
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should do stuff' do
|
49
|
+
g = Grouping.new do |grouping|
|
50
|
+
grouping.combinator = :or
|
51
|
+
grouping.add_grouping do |new_grouping|
|
52
|
+
new_grouping.add_condition(Condition.new(attribute: 'ItemNumber', value: 'RC')).
|
53
|
+
add_condition(Condition.new(attribute: 'LocationCode', value: '002'))
|
54
|
+
end
|
55
|
+
grouping.add_grouping do |new_grouping|
|
56
|
+
new_grouping.add_condition(Condition.new(attribute: 'ItemNumber', value: 'RC')).
|
57
|
+
add_condition(Condition.new(attribute: 'LocationCode', value: '001'))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
g.groupings.size.should eq 2
|
62
|
+
end
|
63
|
+
|
42
64
|
it 'should allow adding conditions en masse' do
|
43
65
|
subject.add_conditions(
|
44
66
|
[Condition.new(attribute: 'location_code', value: '001', predicate: 'eq'),
|
@@ -75,7 +97,7 @@ describe Grouping do
|
|
75
97
|
id.should eq grouping.id
|
76
98
|
end
|
77
99
|
|
78
|
-
it 'should build a ransack hash' do
|
100
|
+
it 'should build a complex ransack hash' do
|
79
101
|
complex.ransackify.should eq FactoryGirl.build(:grouping_hash)
|
80
102
|
end
|
81
103
|
|
@@ -13,7 +13,7 @@ describe RansackQuery do
|
|
13
13
|
klass.should equal Grouping
|
14
14
|
end
|
15
15
|
|
16
|
-
it 'should return a
|
16
|
+
it 'should return a json string' do
|
17
17
|
RansackQuery.build do |grouping|
|
18
18
|
grouping.id = 'id1'
|
19
19
|
grouping.add_condition do |condition|
|
@@ -21,18 +21,7 @@ describe RansackQuery do
|
|
21
21
|
condition.attribute = 'attribute'
|
22
22
|
condition.value = 'value'
|
23
23
|
end
|
24
|
-
end.should eq({
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should return a json string if specified' do
|
28
|
-
RansackQuery.build(format: :json) do |grouping|
|
29
|
-
grouping.id = 'id1'
|
30
|
-
grouping.add_condition do |condition|
|
31
|
-
condition.id = 'id2'
|
32
|
-
condition.attribute = 'attribute'
|
33
|
-
condition.value = 'value'
|
34
|
-
end
|
35
|
-
end.should eq "{\"g\":{\"id1\":{\"m\":\"and\",\"c\":{\"id2\":{\"a\":{\"0\":{\"name\":\"attribute\"}},\"p\":\"eq\",\"v\":{\"0\":{\"value\":\"value\"}}}}}}}"
|
24
|
+
end.should eq("{\"g\":{\"id1\":{\"m\":\"and\",\"c\":{\"id2\":{\"a\":{\"0\":{\"name\":\"attribute\"}},\"p\":\"eq\",\"v\":{\"0\":{\"value\":\"value\"}}}}}}}" )
|
36
25
|
end
|
37
26
|
|
38
27
|
it 'should allow a prefix to be passed in' do
|
@@ -43,7 +32,7 @@ describe RansackQuery do
|
|
43
32
|
condition.attribute = 'attribute'
|
44
33
|
condition.value = 'value'
|
45
34
|
end
|
46
|
-
end.should eq({
|
35
|
+
end.should eq("{\"q\":{\"g\":{\"id1\":{\"m\":\"and\",\"c\":{\"id2\":{\"a\":{\"0\":{\"name\":\"attribute\"}},\"p\":\"eq\",\"v\":{\"0\":{\"value\":\"value\"}}}}}}}}")
|
47
36
|
end
|
48
37
|
|
49
38
|
end
|