Skip to content
Easy searching for ActiveRecord applications
Ruby
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
.gitignore
.rspec
CHANGELOG
Gemfile
Gemfile.lock
LICENSE.txt
README.rdoc
Rakefile
mind_reader.gemspec

README.rdoc

MindReader: Easy searching for ActiveRecord applications

Given the following objects:

@robin = Customer.create! :name => 'Damian Wayne',
                          :address => 'Wayne Manor, Gotham City',
                          :age => 14
@batman = Customer.create! :name => 'Dick Grayson',
                           :address => 'Wayne Manor, Gotham City',
                           :sidekick_id => @robin.id,
                           :age => 26
@superman = Customer.create! :name => 'Kal-El',
                             :address => 'Kandor, New Krypton',
                             :age => 36

Find by one field:

reader = MindReader.new(Customer)
result = reader.execute(:address => 'Wayne Manor, Gotham City')
result.should have(2).bat_heroes
result.should include(@batman, @robin)

Find by multiple fields:

reader = MindReader.new(Customer)
reader.execute(:address => 'Wayne Manor, Gotham City',
  :name => 'Dick Grayson').should == [@batman]

String fields are evaluated partially:

result = reader.execute(:name => 'ay')
result.should have(2).super_heroes
result.should include(@batman, @robin)

Find with lookup:

reader = MindReader.new(Customer) do |r|
  r.sidekick_id(:lookup => :sidekick_name) {|name| Customer.find_by_name(name).id }
end
reader.execute(:sidekick_name => 'Damian Wayne').should == [@batman]

Find given a range:

reader = MindReader.new(Customer) do |r|
  r.age :range => :start_age..:end_age
end
reader.execute('start_age' => 25, 'end_age' => 36).should == [@batman, @superman]

Blank fields are ignored:

reader = MindReader.new(Customer)
reader.execute(:name => 'Kal-El', :address => '').should == [@superman]

If all fields are blank, returns nil:

reader = MindReader.new(Customer)
reader.execute(:name => '', :address => '').should be_nil

unless you say you want all objects:

reader = MindReader.new(Customer)
reader.retrieve_all_when_no_value_is_given = true
result = reader.execute(:name => '', :address => '')
result.should have(3).super_heroes
result.should include(@batman, @robin, @superman)

mind_reader supports converters for incoming data. For sake of example, imagine you have to enter a date in a different format (here, dd/mm/yyyy), and you want to convert it to default yyyy-mm-dd:

def convert_to_default(br_date)
  br_date =~ /(\d+)\/(\d+)\/(\d+)/
  "%s-%s-%s" % [$3, $2, $1]
end

reader = MindReader.new(SuperHero) do |r|
  r.date_of_heroic_birth :range => :from_date..:to_date, :converter => lambda {|d| convert_to_default(d) }
end
reader.execute('from_date' => '01/04/2010', 'to_date' => '30/04/2010').should == [@batman]

How to install

$ gem install mind_reader

How to run specs

$ rake spec

Copyright

Copyright © 2011 Rodrigo Manhães. See LICENSE.txt for further details.

Something went wrong with that request. Please try again.