【问题标题】:Automatically upcase column and table names in activerecord在活动记录中自动大写列名和表名
【发布时间】:2013-09-02 12:25:48
【问题描述】:

我正在开发一个在几个不同机构中运行的 Rails 应用程序。它必须与每个旧数据库接口。所有这些数据库都是Oracle,所有的列名和表名都是小写的。

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

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

有没有办法让活动记录自动将所有对数据库的调用转换为大写?我可以在某处覆盖的方法?


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

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

在每个受影响的模型中(尽管我已将其固定在可以包含或不包含的模块中,具体取决于适配器。

我正在尝试找出可以合并到同一个模块中的表名的处理方法。

【问题讨论】:

  • 好的。那么,这个问题有什么问题值得反对呢?
  • 我认为你的问题是一个很好的问题,但它并没有表明你为解决问题付出了任何努力。如果看起来你只是想让别人为你做你的工作,人们通常不会愿意提供帮助。您是否尝试过查看 ruby​​ 文档以了解它是如何计算表名的?有一些明显的关键字可以让你开始,例如table_name
  • 很公平。可能没有详细说明我在问题中尝试过的内容。我摆弄着重新定义表名。所有受影响的模型都有一个超类,它创建与旧数据库的连接,所以我希望我可以通过升级超方法重新定义其中的 table_name 方法,但它不起作用;我想是因为它最终只是向我的超类询问一个表名,当然,它没有。
  • 上次我使用MS SQL,默认是表/列名不区分大小写。你的情况不是这样吗?
  • 啊,这很有趣。它肯定是代理大小写敏感的。不幸的是,我对 MS SQL 知之甚少,我不得不远程与数据库管理员打交道。我想知道它是否会询问他们是否有区分大小写的设置。

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


【解决方案1】:

好的。在浪费了几个小时试图解决问题后,我在activerecord-sqlserver-adapter 中找到了配置选项,它为您完成了所有工作。直接放下:

ActiveRecord::ConnectionAdapters::SQLServerAdapter.lowercase_schema_reflection = true

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

天哪!

【讨论】:

    【解决方案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
    

    【讨论】:

    • 这与我开始解决问题的方式非常相似。我从列名而不是表名开始。我创建了一个模块,它将所有列别名为它们的小写对应项,并将其包含到模型中。
    • @kevtufc 您能否分享一下您如何设法将列名覆盖为小写的要点
    • @carbonr 我写的接受的答案就是这样。只需将那条线粘贴在启动时就会运行的地方。我已经在 config/initializers 中有一个文件,我在其中定义了一些与数据库对话的默认值,所以我把它放在那里。它可以解决所有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2014-07-20
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多