在activerecord中自动升级列和表名称

时间:2013-09-02 12:25:48

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

我在一个在几个不同机构运行的rails应用程序上工作。它必须与每个遗留数据库连接。所有这些数据库都是Oracle,所有列名和表名都是小写的。

其中一家机构已将其数据库移至MS SQL数据库。结构都是一样的,我已经将应用程序连接到它,它看起来一切正常,除了一个问题。

在MS SQL db上,所有表名和列名现在都是大写的。

有没有办法让主动记录自动将所有对DB的调用转换为大写?我可以覆盖某个方法吗?


所以,我认为(不能测试很多)我已经修复了列名部分。我基本上已经完成了

column_names.each {|c| alias_attribute c.downcase, c}

在每个受影响的模型中(虽然我已经把它放在一个模块中,我可以包括或不包括,取决于适配器。

我正在尝试弄清楚如何处理表名,我可以把它放在同一个模块中。

2 个答案:

答案 0 :(得分:4)

确定。浪费了几个小时试图解决问题的代码后,我在activerecord-sqlserver-adapter中找到了配置选项,它可以为您完成所有操作。请放弃:

ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true

进入config/initializers中的文件,一切正常。

D'哦!

答案 1 :(得分:2)

不是为所有模型设置表名(这将影响到另一个数据库的任何部署),我建议初始化程序以编程方式将表名更改为基于适配器的大写。这有点猜测,但是这样的事情应该让你开始:

#config/initializers/table_name.rb
module ActiveRecord
  module ModelSchema
    module ClassMethods
      def table_name
        reset_table_name unless defined?(@table_name)
        if ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mssql"    
          @table_name.upcase
        else
          @table_name
        end
      end
    end
  end
end