ActiveRecord/ActiveModel属性区分大小写
我正在将传统应用程序从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试图检索他们之前的属性名称转换为小写?
声明:这是一个非常临时解决方案 - 绝对不是“正确”的事情!
创建的视图是这样的:
CREATE VIEW mymodel AS
SELECT
at.someattribute
, at.someattribute AS "SomeAttribute"
FROM actual_table at
使用双引号SQL保留的情况。
我目前正在使用两个不同的项目,使用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与旧数据库交谈!我很想听听别人的想法。
你有没有想过这个? – Altonymous 2013-04-17 16:46:24