conditioner for ActiveRecord-friendly conditions from a collection
I frequently have a collection of values that I want to match in an ActiveRecord query, but it would be nice if I could let ActiveRecord handle checking the data and escaping it properly. So, I wrote this method to return ActiveRecord-friendly conditions, such as:
1 |
["user_id=? AND job_id=?", 3, 4] |
based on the ‘raw’ conditions you feed to it, such as:
1 |
[['user_id', 3], ['job_id', 4]] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Returns ActiveRecord-friendly conditions based on the given # raw conditions; handles grouping based on like field names; # allows different boolean operators in raw conditions; # allows different comparison operators in raw conditions; # raw conditions setup: # [[field name, desired value, bool. op., comp. op.], ...] # raw conditions example: # [['type_id', '4', 'OR'], ['created_on', Date.new, 'AND', '<=']] def conditioner( raw_conditions ) conditions = ["("] count = 0 prev_name = raw_conditions[0][0] raw_conditions.each do |condition| name = condition[0] value = condition[1] if condition[2] bool_type = condition[2] else bool_type = 'OR' end if condition[3] comparison = condition[3] else comparison = '=' end conditions[0] << ') AND ' if prev_name != name conditions[0] << ' ' << bool_type.to_s << ' ' unless count == 0 || prev_name != name conditions[0] << '(' if prev_name != name conditions[0] << "#{name} #{comparison} ?" conditions << value prev_name = name count += 1 end conditions[0] << ')' conditions end |
This way, you can do something like the following:
comments powered by Disqus