How to merge strings just like ActiveRecord conditions do
While you can achieve the same functionality using sprintf, this may provide a cleaner approach and one that you are more familiar with. This will allow you to build a string the same way you can use ActiveRecord and the :conditions option.
Basically how this works is by overriding the Array class and adding a method to merge the string and values together into unified string! Enough talk, lets see some code:
class Array def merge statement, *values = self expected = statement.count("?") provided = values.size unless expected.eql?(provided) raise "wrong number of bind variables (#{provided} for #{expected}) in: #{statement}" end bound = values.dup statement.gsub("?") { bound.shift } end end
As you can see, if you do not provide the right number of values for the statement, it will raise and error. Here is how you would use it:
puts ["Hello ?, how are you", "John"].merge #=> Hello John, how are you
Likewise, you can use variables to hold values:
message = "Hello ?, how are you" name = "John" puts [message, name].merge #=> Hello John, how are you
This will also work with multiple values:
puts ["Hello ?, ? and ?, how are you", "John", "Joe", "Jim"].merge #=> Hello John, Joe, and Jim, how are you
The only downside to this currently is that you cannot use a ? in the string you are merging, as it will think its a binding character.