Rails / ActiveRecord:如何在自定义查询中使用#select引用受保护的列名?

时间:2015-01-21 17:43:11

标签: ruby-on-rails ruby sql-server ruby-on-rails-4 activerecord

使用连接到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正确引用列名?

谢谢

2 个答案:

答案 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