You can do it:
Widget.all(:conditions => ["(a,b) in ((?),(?))", [1,2], [3,4]])
Although this is not ideal if you have a variable number of values. Sounds good for a patch for ActiveRecord!
Update: kludge for a variable number of values. Better than doing find_by_sql ... but you're right, it should be supported by AR natively.
values = [[1,2],[3,4]]
Widget.all(:conditions => ["(a,b) in (#{Array.new(values.length,'(?)').join(',')})", *values])