CrazyHashFilter
Hash filtering by advanced rules.
Can be used to reduce API data throughput if you are building API responses from hashes.
Installation
Add this line to your application's Gemfile:
gem 'crazy_hash_filter'
Usage
You can use hash filter like this:
filtered_hash = CrazyHashFilter.process(hash, rules)
Or shorthand versions:
filtered_hash = hash.crazy_filter(rules)
Filtering in place:
hash.crazy_filter!(rules)
Sample hash
@sample = {
:code => 0,
:items => [
{ :id => 1,
:title => 'First item',
:thumbs => [
{ :code => '50', :url => 'http://some-url/1/50' },
{ :code => '100', :url => 'http://some-url/1/100' },
{ :code => '150', :url => 'http://some-url/1/150' }
]
},
{ :id => 2,
:title => 'Second item',
:thumbs => [
{ :code => '50', :url => 'http://some-url/2/50' },
{ :code => '100', :url => 'http://some-url/2/100' },
{ :code => '150', :url => 'http://some-url/2/150' }
]
},
]
}
Simple filtering
rules = { :select => [ :code ] }
Result
result = CrazyHashFilter.process(@sample, rules)
{ :code => 0 }
Filtering with nested rules
rules = {
:select => [ :code, :items ],
:child_rules => {
:items => { :select => [ :id, :title ] }
}
}
Result
result = CrazyHashFilter.process(@sample, rules)
{ :code=>0,
:items=> [
{:id=>1, :title=>"First item"},
{:id=>2, :title=>"Second item"}
]
}
Filtering with conditions
rules = {
:select => [ :code, :items ],
:child_rules => {
:items => {
:select => [ :id, :thumbs ],
:child_rules => {
:thumbs => {
:conditions => {
:code => '50'
}
}
}
}
}
}
Result
result = CrazyHashFilter.process(@sample, rules)
{ :code=>0,
:items=> [
{ :id=>1, :thumbs=> [ { :code=>"50", :url=> "http://some-url/1/50" } ] },
{ :id=>2, :thumbs=> [ { :code=>"50", :url=> "http://some-url/2/50" } ] }
]}
Filtering with conditions array
rules = {
:select => [ :code, :items ],
:child_rules => {
:items => {
:select => [ :id, :thumbs ],
:child_rules => {
:thumbs => {
:conditions => {
:code => [ '50', '100' ]
}
}
}
}
}
}
Result
result = CrazyHashFilter.process(@sample, rules)
{ :code => 0,
:items=> [
{ :id=>1,
:thumbs=>[
{ :code => "50", :url => "http://some-url/1/50" },
{ :code => "100", :url => "http://some-url/1/100" }
]
},
{ :id => 2,
:thumbs => [
{ :code => "50", :url => "http://some-url/2/50" },
{ :code => "100", :url => "http://some-url/2/100" }
]
}
]
}