Skip to content

Instantly share code, notes, and snippets.

@dkubb
Forked from paul/conditions_examples.rb
Created January 29, 2009 06:32
Show Gist options
  • Save dkubb/54421 to your computer and use it in GitHub Desktop.
Save dkubb/54421 to your computer and use it in GitHub Desktop.
# As an exercise, come up with a ruby-way to specify
# a set of search conditions for this SQL:
# simple or
# WHERE name = 'Dan' OR name = 'Paul'
# nested or, plus duplicating field names
# WHERE name = 'Paul' AND ( age < 18 OR age > 21 )
# not ( and don't say != )
# WHERE NOT name = 'Paul'
# Some of these might not work, I'm just brainstorming, and soliciting ideas
# prefix
Model.all(and(:name => "Paul", or(:age => lt(18), :age => gt(21))
# expressions
Model.all( c(:name => "Paul").and(c(:age => lt(18)).or(:age => gt(21))) )
# ambition-style
Model.all( name == "Paul" && ( age < 18 || age > 21 ) )
# Hashes. Assumes a plain hash is AND'ed
Model.all( :name => "Paul",
:or => { :age => [lt(18), gt(21)] } )
# Custom parser
Model.all( " name = 'Paul' AND ( age < 18 OR age > 21 ) " )
# super-prefix
Model.all eq(:name, 'Paul').or(lt(:age, 18), gt(:age, 21))
# namelessjon
Model.all( { :name => 'Paul' }, {:age => 21, :name => 'Joe'} )
# lisp-y afrench
Model.all( :conditions => [:and, [:eql, :name, 'Paul'], [:or, [:lt, :age, 18], [:gt, :age, 21]]] )
# From dkubb: (not my favorite, just throwing it out there)
# WHERE name = 'Dan' OR name = 'Paul'
Model.all { |o| o.or(o.name == 'Dan', o.name == 'Paul') }
# WHERE name = 'Paul' AND ( age < 18 OR age > 21 )
Model.all { |o| o.and(o.name == 'Paul', o.or(o.age < 18, o.age > 21)) }
# WHERE NOT name = 'Paul'
Model.all { |o| o.not(o.name == 'Paul') }
# Also from dkubb: (Enumerable API, Ambition clone, my favorite approach)
# WHERE name = 'Dan' OR name = 'Paul'
Model.select { |o| o.name == 'Dan' || o.name == 'Paul' }
# WHERE name = 'Paul' AND ( age < 18 OR age > 21 )
Model.select { |o| o.name == 'Paul' && (o.age < 18 || o.age > 21) }
# WHERE NOT name = 'Paul'
Model.select { |o| o.name != 'Paul' }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment