2013-03-07 64 views
0

我正在将传统应用程序从MS-SQL移动到使用Rails访问数据的Postgres。ActiveRecord/ActiveModel属性区分大小写

在MS-SQL的列被资本化,而使用ActiveRecord-SQL服务器适配器,他们是这样写的:

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试图检索他们之前的属性名称转换为小写?

+0

你有没有想过这个? – Altonymous 2013-04-17 16:46:24

回答

0

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

创建的视图是这样的:

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

使用双引号SQL保留的情况。

0

我目前正在使用两个不同的项目,使用Rails连接到传统的MS SQL Server数据库......表名和列名不符合Rails的预期。

在我最近的项目中,我想我刚刚找到了这个金蛋:-)这就是为了不改变Rails方面的任何东西,以使事情发挥作用 - 金蛋是使用SQL视图来“将遗留表格转化为Rails理解的东西 - 我目前在开发中有一个项目,我正在开发这个工作的地方,而且我不必在Rails上尝试别名或者列表名称因为当它到达我的Rails应用程序时,一切都看起来很微妙。我现在发布这个消息是因为我的第一个项目有很多问题需要解决,我认为这可能让其他人的生活变得更加容易,而且我还没有发现这个解决方案发布在其他地方。

因此,举例来说,假设您有在Microsoft SQL Server 2008R2遗留表名为“接触表”,它具有怪异的列名像这样:

Contact-Table: 
    ID_Primary 
    First Name 
    Last Name 

使用,您可以MS SQL表视图'重新创建'这张桌子。基于Legacy-Table创建视图;命名视图无论你想在Rails中调用'table'并使用列别名来重命名列。所以,在这里我们可以(与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与旧数据库交谈!我很想听听别人的想法。

相关问题