Я хочу сделать конкатенацию строк стороны базы данных в запросе направляющих и сделать это независимым от базы данных способом.
SQL-92 указывает двойную черту (||
) как оператор конкатенации. К сожалению, похоже, что SQL Server MS не поддерживает его; это использует +
вместо этого.
Я предполагаю, что абстракция грамматики SQL направляющих уже решила определенную для дб проблему оператора. Если это действительно существует, как я использую его?
У меня была та же проблема, и я так и не придумал ничего, что было бы встроено в Rails. Итак, я написал этот небольшой метод.
# Symbols should be used for field names, everything else will be quoted as a string
def db_concat(*args)
adapter = configurations[RAILS_ENV]['adapter'].to_sym
args.map!{ |arg| arg.class==Symbol ? arg.to_s : "'#{arg}'" }
case adapter
when :mysql
"CONCAT(#{args.join(',')})"
when :sqlserver
args.join('+')
else
args.join('||')
end
end
Я думаю, что кому-то действительно стоит написать какой-то вспомогательный модуль SQL, который мог бы автоматически форматировать простые выражения SQL, используя правильные функции или операторы для текущего адаптера. Может, я сам напишу.
Если вы хотите что-то нейтральное для Rails, вам нужно будет вернуть значения, которые вы хотите объединить, и сделать это после того, как данные будут доставлены в рельсы (или сделать это в рельсах, прежде чем указывать его в базу данных).
Похоже, что Mysql использует CONCAT (), Postgres ||, Oracle CONCAT () или ||, T-SQL +.
Любая рельсовая абстракция одного и того же должна иметь место в точке, где вы могли бы просто выполнять конкатенацию с использованием обычного Ruby, иначе я совершенно неправильно понял вопрос.