0
+h2. An Ambitious ActiveRecord Adapter
0
+I could tell you all about how awesome the internals are, or
0
+how fun it was to write, or how it'll make you rich and famous,
0
+but instead I'm just going to show you some examples.
0
+@$ sudo gem install ambitious-activerecord@
0
+This will suck in the adapter and its dependencies (ActiveRecord & Ambition).
0
+It's fully usable outside of Rails (I use it in a Camping app or two), as long
0
+as you're riding ActiveRecord.
0
+To use with Rails, after installing the gem:
0
+$ gem unpack ambitious-activerecord
0
+Basically, you write your SQL in Ruby. No, not in Ruby. As Ruby.
0
+User.select { |u| u.city == 'San Francisco' }.each do |user|
0
+The key is that queries aren't actually run until the data they represent is
0
+requested. Usually this is done with what I call a kicker method. You can call them
0
+Kicker methods are guys like @detect@, @each@, @each_with_index@, @map@, @entries@,
0
+@to_a@, and @first@ (with no argument). Methods like @select@, @sort_by@, and @first@
0
+(with an argument) are not kicker methods and return a @Context@ object without running any SQL.
0
+Our @Context@ object has two useful methods: @to_s@ and @to_hash@. With these,
0
+we can check out what exactly we're building. Not everyone has @to_s@,
0
+though. Mostly ignore these methods and treat everything like you normally
0
+>> User.select { |m| m.name == 'jon' }.to_s
0
+=> "SELECT * FROM users WHERE users.name = 'jon'"
0
+>> User.select { |m| m.name == 'jon' }.to_hash
0
+=> { :conditions => "users.name = 'jon'" }
0
+h2. Equality - select { |u| u.field == 'bob' }
0
+User.select { |m| m.name == 'jon' }
0
+"SELECT * FROM users WHERE users.name = 'jon'"
0
+User.select { |m| m.created_at > 2.days.ago }
0
+"SELECT * FROM users WHERE users.created_at > '2007-09-26 20:37:47'"
0
+User.select { |m| m.name == 'jon' }
0
+"SELECT * FROM users WHERE users.name = 'jon'"
0
+User.select { |m| m.name != 'jon' }
0
+"SELECT * FROM users WHERE users.name <> 'jon'"
0
+User.select { |m| m.name == 'jon' && m.age == 21 }
0
+"SELECT * FROM users WHERE (users.name = 'jon' AND users.age = 21)"
0
+User.select { |m| m.name == 'jon' || m.age == 21 }
0
+"SELECT * FROM users WHERE (users.name = 'jon' OR users.age = 21)"
0
+User.select { |m| m.name == 'jon' || m.age == 21 && m.password == 'pass' }
0
+"SELECT * FROM users WHERE
0
+ (users.name = 'jon' OR (users.age = 21 AND users.password = 'pass'))"
0
+User.select { |m| (m.name == 'jon' || m.name == 'rick') && m.age == 21 }
0
+"SELECT * FROM users WHERE
0
+ ((users.name = 'jon' OR users.name = 'rick') AND users.age = 21)"
0
+h2. Associations - select { |u| u.field == 'bob' && u.association.field == 'bob@bob.com' }
0
+The @to_s@ method doesn't work on associations yet, but that's okay: they can
0
+still query through ActiveRecord just fine.
0
+ u.email == 'chris@ozmm.org' && u.profile.name == 'chris wanstrath'
0
+"SELECT users.id AS t0_r0, ... FROM users
0
+ LEFT OUTER JOIN profiles ON profiles.user_id = users.id
0
+ WHERE ((users.email = 'chris@ozmm.org' AND profiles.name = 'chris wanstrath'))"
0
+h2. Comparisons - select { |u| u.age > 21 }
0
+User.select { |m| m.age > 21 }
0
+"SELECT * FROM users WHERE users.age > 21"
0
+User.select { |m| m.age < 21 }.to_s
0
+"SELECT * FROM users WHERE users.age < 21"
0
+User.select { |m| [1, 2, 3, 4].include? m.id }
0
+"SELECT * FROM users WHERE users.id IN (1, 2, 3, 4)"
0
+h2. LIKE and REGEXP (RLIKE) - select { |m| m.name =~ 'chris' }
0
+User.select { |m| m.name =~ 'chris' }
0
+"SELECT * FROM users WHERE users.name LIKE 'chris'"
0
+User.select { |m| m.name =~ 'chri%' }
0
+"SELECT * FROM users WHERE users.name LIKE 'chri%'"
0
+User.select { |m| m.name !~ 'chris' }
0
+"SELECT * FROM users WHERE users.name NOT LIKE 'chris'"
0
+User.select { |m| !(m.name =~ 'chris') }
0
+"SELECT * FROM users WHERE users.name NOT LIKE 'chris'"
0
+User.select { |m| m.name =~ /chris/ }
0
+"SELECT * FROM users WHERE users.name REGEXP 'chris'"
0
+User.detect { |m| m.name == 'chris' }
0
+"SELECT * FROM users WHERE users.name = 'chris' LIMIT 1"
0
+h2. LIMITs - first, first(x), [offset, limit], [range], slice
0
+User.select { |m| m.name == 'jon' }.first
0
+"SELECT * FROM users WHERE users.name = 'jon' LIMIT 1"
0
+User.select { |m| m.name == 'jon' }.first(5)
0
+"SELECT * FROM users WHERE users.name = 'jon' LIMIT 5"
0
+User.select { |m| m.name == 'jon' }[10, 20]
0
+"SELECT * FROM users WHERE users.name = 'jon' LIMIT 10, 20"
0
+User.select { |m| m.name == 'jon' }[10..20]
0
+"SELECT * FROM users WHERE users.name = 'jon' LIMIT 10, 10"
0
+h2. ORDER - sort_by { |u| u.field }
0
+User.select { |m| m.name == 'jon' }.sort_by { |m| m.name }
0
+"SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.name"
0
+User.select { |m| m.name == 'jon' }.sort_by { |m| [ m.name, m.age ] }
0
+"SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.name, users.age"
0
+User.select { |m| m.name == 'jon' }.sort_by { |m| [ m.name, -m.age ] }
0
+"SELECT * FROM users WHERE users.name = 'jon'
0
+ ORDER BY users.name, users.age DESC"
0
+User.select { |m| m.name == 'jon' }.sort_by { |m| [ -m.name, -m.age ] }
0
+"SELECT * FROM users WHERE users.name = 'jon'
0
+ ORDER BY users.name DESC, users.age DESC"
0
+User.select { |m| m.name == 'jon' }.sort_by { |m| -m.age }
0
+"SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.age DESC"
0
+User.select { |m| m.name == 'jon' }.sort_by { |m| -m.profiles.title }
0
+"SELECT users.id AS t0_r0, ... FROM users
0
+ LEFT OUTER JOIN profiles ON profiles.user_id = users.id
0
+ WHERE (users.name = 'jon') ORDER BY profiles.title DESC"
0
+User.select { |m| m.name == 'jon' }.sort_by { rand }
0
+"SELECT * FROM users WHERE users.name = 'jon' ORDER BY RAND()"
0
+h2. COUNT - select { |u| u.name == 'jon' }.size
0
+User.select { |m| m.name == 'jon' }.size
0
+"SELECT count(*) AS count_all FROM users WHERE (users.name = 'jon')"
0
+>> User.select { |m| m.name == 'jon' }.size
0
+These methods perform COUNT() operations rather than loading your array into memory. They're all
0
+User.any? { |m| m.name == 'jon' }
0
+User.all? { |m| m.name == 'jon' }
0
+User.select { |m| m.name == 'jon' }.empty?
0
+The @downcase@ and @upcase@ methods will map to LOWER() and UPPER(), respectively.
0
+>> User.select { |m| m.name.downcase =~ 'jon%' }.to_s
0
+=> "SELECT * FROM users WHERE LOWER(users.name) LIKE 'jon%'"
0
+Columns and values will be quoted using ActiveRecord's quote_column_name and quote methods, if
0
+Found a bug? Sweet. Add it at "the Lighthouse":http://err.lighthouseapp.com/projects/466-plugins/tickets/new.
0
+More information on Ambition:
0
+ * "http://ambition.rubyforge.org":http://ambition.rubyforge.org
0
+ * "http://groups.google.com/group/ambition-rb/":http://groups.google.com/group/ambition-rb/
0
+- Chris Wanstrath [ chris@ozmm.org ]
0
\ No newline at end of file
Comments
No one has commented yet.