Aún no ha recibido mucho uso pero escribí el siguiente código que parece resolver el problema. Este mono-parches de los adaptadores de disponer de un método para apoyarlo:
module ActiveRecord
module ConnectionAdapters
class AbstractAdapter
# Will return the given strings as a SQL concationation. By default
# uses the SQL-92 syntax:
#
# concat('foo', 'bar') -> "foo || bar"
def concat(*args)
args * " || "
end
end
class AbstractMysqlAdapter < AbstractAdapter
# Will return the given strings as a SQL concationation.
# Uses MySQL format:
#
# concat('foo', 'bar') -> "CONCAT(foo, bar)"
def concat(*args)
"CONCAT(#{args * ', '})"
end
end
class SQLServerAdapter < AbstractAdapter
# Will return the given strings as a SQL concationation.
# Uses MS-SQL format:
#
# concat('foo', 'bar') -> foo + bar
def concat(*args)
args * ' + '
end
end
end
end
Con esto, usted debe ser capaz de hacer lo siguiente en su código:
class User < ActiveRecord::Base
def self.find_by_name(name)
where("#{connection.concat('first_name', 'last_name')} = ?", name)
end
end
Esto da salida a la siguiente consulta SQL en una base de datos SQL-92 (Oracle, SQLite, PostgreSQL):
SELECT * FROM users WHERE first_name || last_name = ?
Para MySQL se da salida:
SELECT * FROM users WHERE CONCAT(first_name, last_name) = ?
Para SQL Server emite
SELECT * FROM users WHERE first_name + last_name = ?
Obviamente se podría extender este concepto a otros adaptadores de base de datos.
Creo que si va a existir, usted será el que lo escriba :-P –
FYI, lo escribí http://github.com/adamcrown/port-a-query. Aún no hay mucho, pero maneja la concatenación en MySQL y SQLite – aNoble