使用连接到Microsoft SQL Server 2012的TinyTDS运行Rails 4.0.13,我正在尝试运行以下查询:
sql = Model.where(:foo => bar).select(:open, :high, :low, :close).to_sql
Model.connection.execute(sql)
问题是,生成的sql是
"SELECT open, high, low, close FROM [models]"
由于列名称打开和关闭受到保护,因此给出了错误。
TinyTds::Error: Incorrect syntax near the keyword 'open'
如果我使用#pluck
,我可以看到生成了正确的SQL(列名被转义):
"SELECT [models].[open], [models].[high], [models].[low], [models].[close] FROM [models]"
然而,这会产生一个数组,这不是我想要的。
我的问题是如何让#select
正确引用列名?
谢谢
答案 0 :(得分:1)
我认为您在使用符号时可以使用select方法保护列名(可能因为不同的DBMS使用不同的引号标识符),但您可以将选择作为字符串传递:
sql = Model.where(:foo => bar).select("[open], [high], [low], [close]").to_sql
Model.connection.execute(sql)
答案 1 :(得分:0)
我试图向Rails提交错误报告,但是这样做我看到使用SQLite测试用例似乎不存在问题,这让我相信问题出在SQL Server适配器上。
因为我在Rails 4而不是最新版本的适配器,所以我离开了它并编写了以下(可怕的)方法,因为包装列名称还不够,我需要在表格前加以防止模糊的列名称。呸
def self.quote(*columns, klass)
columns.map { |col| "[#{klass.table_name}].[#{col}]" }.join(', ')
end