2013-03-07 73 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與舊數據庫交談!我很想聽聽別人的想法。