我正在将遗留应用程序从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将属性名称转换为小写?
答案 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与遗留数据库交谈!我很想听听别人的想法。