Nie otrzymał jeszcze dużego wykorzystania, ale napisałem następujący kod, który wydaje się rozwiązać problem. Ta małpa-łata adaptery mieć sposób, aby go wspierać:
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
Z tego powinieneś być w stanie wykonać następujące czynności w kodzie:
class User < ActiveRecord::Base
def self.find_by_name(name)
where("#{connection.concat('first_name', 'last_name')} = ?", name)
end
end
ten wyprowadza następujące zapytanie SQL na zasadzie SQL 92 danych (Oracle SQLite PostgreSQL)
SELECT * FROM users WHERE first_name || last_name = ?
MySQL wyprowadza:
SELECT * FROM users WHERE CONCAT(first_name, last_name) = ?
Dla SQL Server wyprowadza
SELECT * FROM users WHERE first_name + last_name = ?
Oczywiście można rozszerzyć tę koncepcję do innych adapterów baz danych.
Myślę, że jeśli to będzie istniało, będziesz tym, który to napisze :-P –
FYI, napisałem to http://github.com/adamcrown/port-a-query. Nie ma jeszcze zbyt wiele, ale radzi sobie z konkatenacją w MySQL i SQLite – aNoble