Rails / ActiveRecord:如何在自定义查询中使用#select 引用受保护的列名称?
Rails / ActiveRecord: How to quote protected column name using #select in custom query?
运行 Rails TinyTDS 4.0.13 连接到 Microsoft SQL Server 2012,我正在尝试 运行 以下查询:
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
正确引用列名?
谢谢
我不认为你可以在使用符号时使用 select 方法来保护你的列名(可能是因为不同的 DBMS 使用不同的引用标识符),但你可以通过你的 selection作为字符串:
sql = Model.where(:foo => bar).select("[open], [high], [low], [close]").to_sql
Model.connection.execute(sql)
我试图向 Rails 提交错误报告,但是在这样做时我发现使用 SQLite 测试用例似乎不存在问题,这让我相信问题出在使用 SQL 服务器适配器。
因为我使用的是 Rails 4 而不是最新版本的适配器,所以我离开了它并编写了以下(可怕的)方法,因为包装列名是不够的,我需要在 table 以防止列名不明确。呸
def self.quote(*columns, klass)
columns.map { |col| "[#{klass.table_name}].[#{col}]" }.join(', ')
end
运行 Rails TinyTDS 4.0.13 连接到 Microsoft SQL Server 2012,我正在尝试 运行 以下查询:
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
正确引用列名?
谢谢
我不认为你可以在使用符号时使用 select 方法来保护你的列名(可能是因为不同的 DBMS 使用不同的引用标识符),但你可以通过你的 selection作为字符串:
sql = Model.where(:foo => bar).select("[open], [high], [low], [close]").to_sql
Model.connection.execute(sql)
我试图向 Rails 提交错误报告,但是在这样做时我发现使用 SQLite 测试用例似乎不存在问题,这让我相信问题出在使用 SQL 服务器适配器。
因为我使用的是 Rails 4 而不是最新版本的适配器,所以我离开了它并编写了以下(可怕的)方法,因为包装列名是不够的,我需要在 table 以防止列名不明确。呸
def self.quote(*columns, klass)
columns.map { |col| "[#{klass.table_name}].[#{col}]" }.join(', ')
end