将SQL 2014支持添加到activerecord-sqlserver-adapter

时间:2014-08-14 06:57:28

标签: sql-server ruby-on-rails-3 gem monkeypatching

我们正在使用srecserver 2008的activerecord-sqlserver-adapter gem,一切都很好。我们只是尝试针对新的sqlserver 2014 db部署我们的Rails 3应用程序,我收到一条错误消息:

Currently, only 2005, 2008, 2010, 2011, and 2012 are supported. We got back Microsoft SQL Server 2014 - 12.0.2000.8 (X64)

快速浏览一下github,可以看到最近对sqlserver_adapter.rd进行了一次小的更新来解决这个问题。我试图更新gem并且它变成了一点依赖地狱,最终看起来好像我必须升级到rails 4(我现在不特别想做)以获得此修复。

所以我想我第一次尝试使用猴子补丁并在我的初始化文件夹中创建了一个.rd,它包含了添加sqlserver 2014支持的更改:

module ConnectionAdapters  

    class SqlServerAdapter < AbstractAdapter
      SUPPORTED_VERSIONS = [2005,2008,2010,2011,2012,2014]


      # === SQLServer Specific (DB Reflection) ======================== #

       def sqlserver_2014?
        @database_year == 2014
      end



    end
   end

我的目的是简单地覆盖sqlserver_adapter.rd中的几行代码,并修改github上的修复。但是当我尝试部署时,我现在得到一个引用AbstractAdapter的UnitializedConstant错误。

如何使这个补丁工作?或者这有更好的方法来完成这项任务?

3 个答案:

答案 0 :(得分:2)

我找到了比猴子补丁更好的解决方案。原来在activerecord-sqlserver-adapter上的人更新了各种版本所以我只需要指定版本3.2分支与SQLServer 2014支持修复。我的gem文件中的以下行解决了整个问题,我们现在连接到SqlServer '14

gem 'activerecord-sqlserver-adapter', :git => "git://github.com/rails-sqlserver/activerecord-sqlserver-adapter.git", :branch => "3-2-stable" 

答案 1 :(得分:1)

我使用v 4.1.8做了以下内容:

module ActiveRecord
  module ConnectionAdapters
    class SQLServerAdapter < AbstractAdapter
      SUPPORTED_VERSIONS << 2014
      # === SQLServer Specific (DB Reflection) ======================== #

      def sqlserver_2014?
        @database_year = 2014
      end
    end
  end
end

答案 2 :(得分:0)

我也通过继承的Ruby 1.8.6解决了这个问题。

该解决方案并不像这里建议的那样真正高科技。

适配器接口位于C:\ruby\lib\ruby\gems\1.8\gems\activerecord-sqlserver-adapter-2.3.4\lib\active_record\connection_adapters,称为sqlserver_adapter.rb

我修改了以下代码,使其显示为:

    class SQLServerAdapter < AbstractAdapter

  ADAPTER_NAME                = 'SQLServer'.freeze
  VERSION                     = '2.3.4'.freeze
  DATABASE_VERSION_REGEXP     = /Microsoft SQL Server\s+(\d{4})/
  SUPPORTED_VERSIONS          = [2000,2005,2008,2012,2016].freeze
  LIMITABLE_TYPES             = ['string','integer','float','char','nchar','varchar','nvarchar'].freeze
  LOST_CONNECTION_EXCEPTIONS  = {
    :odbc => ['ODBC::Error'],
    :ado  => []
  }
  LOST_CONNECTION_MESSAGES    = {
    :odbc => [/link failure/, /server failed/, /connection was already closed/, /invalid handle/i],
    :ado  => []
  }

我唯一要做的就是修改适配器代码,就是将[2000,2005,2008]更改为[2000,2005,2008,2012,2016]

然后,我使用ODBC数据源管理器(32位)来配置为对Sql Server 2016实例使用“ SQL Server Native Client 11.0”。

最后一步是ODBC适配器设置中非常重要的一步。

“ SQL Server”适配器可能默认为64位连接,尝试连接数据库时会出现以下错误:

#<ODBC::Error: S1090 (0) [Microsoft][ODBC Driver Manager] Invalid string or buffer length>.

我正在将在Apache上运行的旧版Ruby程序的过时的2008R2服务器集改造为新的Windows Server 2016设置,并且没有调试旧版Ruby代码以使其与较新版本的Ruby和Ruby on Rails。

这种技术含量低的解决方案完全可以满足我们的运营需求,预算和时间限制。