ActiveRecord / ActiveModel属性区分大小写

时间:2013-03-07 05:49:49

标签: activerecord activemodel

我正在将遗留应用程序从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将属性名称转换为小写?

2 个答案:

答案 0 :(得分:0)

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

创建如下视图:

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

在SQL中使用双引号保留了这种情况。

答案 1 :(得分:0)

我目前正在开发两个不同的项目,使用Rails连接到传统的MS SQL Server数据库......表和列名称与Rails所期望的不匹配。

在我最近的项目中,我认为我刚刚找到了金蛋:-)而这就是不要在Rails方面改变任何东西以使事情有效 - 金蛋是用SQL Views来“改变“Rails理解的遗留表 - 我现在正在开发一个项目,我正在研究这个工作的奇妙之处,而且我不必尝试在Rails端使用任何表或列名称别名因为到达我的Rails应用程序时,一切看起来都很好看。我现在发布这个是因为我的第一个项目有很多问题需要解决,我认为这可能会让很多其他人的生活变得更加轻松,而且我还没有在其他地方发现这个解决方案。

因此,举例来说,假设您在Microsoft SQL Server 2008R2中有一个名为“Contact-Table”的遗留表,并且它具有类似的奇怪列名:

Contact-Table:
    ID_Primary
    First Name
    Last Name

使用MS SQL表视图,您可以“重新创建”同一个表。根据Legacy-Table创建视图;将视图命名为您希望在Rails中调用“表”并使用列别名重命名列。因此,在这里我们可以使用以下列创建一个名为“contacts”的视图(与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与遗留数据库交谈!我很想听听别人的想法。