0

我正在将一个遗留应用程序从 MS-SQL 移动到使用 Rails 访问数据的 Postgres。

MS-SQL 中的列是大写的,在使用 activerecord-sql-server-adapter 时,它们的读取方式如下:

var something = my_model.SomeAttribute

尽管它是恒定的,但它似乎并不重要,因为应用程序只从 MSSQL 数据库中读取数据。

我现在遇到的问题是在迁移到 postgres 之后,它将所有列名等转换为小写(因为 SQL 并不区分大小写)。现在,当我尝试访问SomeAttribute我的模型时,它会引发一个,ActiveModel::MissingAttributeError因为它现在是小写的。

症状的一些例子:

p.SomeAttribute
=> ActiveModel::MissingAttributeError: missing attribute: SomeAttribute

p.read_attribute(:SomeAttribute)
=> nil

p.has_attribute?(:SomeAttribute)
=> false

p.read_attribute(:someattribute)
=> 'expected value'

有什么方法可以让 ActiveRecord/ActiveModel 在尝试检索属性名称之前将它们转换为小写?

4

2 回答 2

0

我目前正在处理两个不同的项目,使用 Rails 连接到旧版 MS SQL Server 数据库……表名和列名与 Rails 期望的不匹配。

在我最近的项目中,我想我刚刚找到了金蛋 :-) 那就是根本不改变 Rails 方面的任何东西以使事情正常进行——金蛋是使用 SQL 视图来“转换”遗留表转换成 Rails 理解的东西——我目前在 dev 中有一个项目,我正在研究它工作得非常好,而且我不必尝试在 Rails 端为任何表或列名称加上别名,因为一切看起来当它到达我的 Rails 应用程序时很漂亮。我现在发布这个是因为我的第一个项目有很多问题要解决,我认为这可能会让其他许多人的生活更轻松,而且我还没有在其他任何地方找到这个解决方案。

因此,例如,假设您在 Microsoft SQL Server 2008R2 中有一个名为“Contact-Table”的旧表,它具有如下奇怪的列名:

Contact-Table:
    ID_Primary
    First Name
    Last Name

使用 MS SQL 表视图,您可以“重新创建”同一张表。基于 Legacy-Table 创建一个视图;将视图命名为您希望在 Rails 中调用“表”的任何名称,并使用列别名来重命名列。因此,在这里我们可以创建一个名为“联系人”的视图(与 Rails 约定一致),其中包含以下列:

contacts:
    id             (alias for ID_Primary)
    first_name     (alias for First Name)
    last_name      (alias for Last Name)

然后在您的 Rails 模型中,您需要做的就是链接到 MS SQL 中的“联系人”表,并且您的列名可以按预期使用。到目前为止,我已经完成了这项工作,它适用于 tiny-tds gem 和 free-tds。我可以查询、创建和更新记录,Rails 关联(has_many/belongs_to 等)也能正常工作。我对使用 MS SQL 表视图而不是我以前使用的其他方法让 Rails 与遗留数据库对话感到非常兴奋!我很想听听其他人的想法。

于 2015-04-06T22:02:17.657 回答
0

免责声明:这是一个非常临时的解决方案 - 绝对不是“正确”的事情!

像这样创建视图:

CREATE VIEW mymodel AS
    SELECT
        at.someattribute
        , at.someattribute AS "SomeAttribute"
    FROM actual_table at

在 SQL 中使用双引号可以保留大小写。

于 2013-04-18T02:55:02.880 回答