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
endAs 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.