README in ryana-inequal_opportunity-0.1.2 vs README in ryana-inequal_opportunity-0.1.3
- old
+ new
@@ -1,46 +1,64 @@
= Inequal Opportunity
-ActiveRecord is a ruby ORM released with Ruby on Rails. It has a hash syntax
-for specifying SQL conditions:
+inequal_opportunity exists because this does not work in ActiveRecord:
- YourModel.count(:conditions => {:id => 5})
- YourModel.all(:limit => 5, :order => :created_at, :conditions => {:user_id => 5})
+ Doctor.all(:joins => :patients, :conditions => {:patients => ['age > ?', 20]})
-But this hash format lacks inequalities. In order to generate:
+You will get an unknown column exception looking for `doctors`.`age`.
+Instead, you need to write:
- SELECT * from your_models where id <> '42';
+ Doctor.all(:joins => :pateints, :conditions => ['`patients`.`age` > ?', 20])
-You have to write:
+Putting the string table name in the query annoyed me. On top of that,
+I always wanted a way to eliminate strings from my named scopes and queries.
+So now with inequal_opportunity you can write:
- YourModel.count(:conditions => ['id <> ?', 42])
+ Doctor.all(:joins => :patients, :conditions => {:patients => {:age => gt(20)}})
-With Inequal Opportunity, you can write:
+Not only is it prettier (hashed), but ActiveRecord will keep track of
+table names for you.
- YourModel.count(:conditions => {:id => ne(42)})
+ActiveRecord looks for Array and Range types to decide whether to use
+'IN' or 'BETWEEN' instead of the normal '=' as the comparison operator
+when in generating SQL. inequal_opportunity extends that pattern by
+wrapping the value in a series of ActiveRecord::Inequality::Base classes.
+Just wrap the value in one of the following helper functions:
-Where Object#ne wraps 42 in a ActiveRecord::Inequality::NotEqual class,
-which is then used to insert the proper operator into the generated SQL.
-
-Other supported inequalities are:
-
- gte() => >=
+ gte() => >=
gt() => >
lte() => <=
le() => <
ne() => <>
ne(nil) => IS NOT
+and the appropriate SQL will be generated. This works in finds, as shown
+above, in counts:
-Test coverage is real sparse right now. And it's only been tested
-on MySQL. I also am not completely satisfied with the way I overwrite
-ActiveRecord.expand_range_bind_variables, but it works.
+ People.count(:age => gt(20))
+in named scopes:
+
+ class People < AR::B
+ named_scope :underage, :conditions => {:age => lte(18)}
+ end
+
+in default scopes:
+
+ class Feedback < AR::B
+ default_scope :conditions => {:type => ne('spam')}
+ end
+
+and pretty much everywhere else I've tested.
+
+Test coverage is kind of sparse right now, and it's only been tested
+on MySQL. I also am not completely satisfied with the way I alias
+ActiveRecord::Base.expand_range_bind_variables, but it works.
+
== License
-Inequal Opportunity is released under the MIT license.
+inequal_opportunity is released under the MIT license.
== Support
-Just email me at ryan@angilly.com with questions, bugs,
-or patches
+Just email me at ryan@angilly.com with questions, bugs, or patches.