2012-02-19 85 views
0

我在Sinatra應用程序中使用了datamapper。我目前使用命令使用數據映射器從類中刪除屬性時刪除數據庫字段

DataMapper.finalize.auto_upgrade! 

來處理遷移。我有兩個類(藝術家和事件)與'has_n'和'belongs_to'協會。一個藝術家和一位藝術家可以擁有許多與之相關的活動。

我改變的關聯是通過刪除類定義其支配在模型中的原始one_to_many關聯的之前的部分並加入

has n, :artists, :through => Resource 

到事件類和MANY_TO_MANY關係對應的代碼的藝術家班。當我做一個新的事件時,一個錯誤將被啓動。

#<DataObjects::IntegrityError: events.artist_id may not be NULL 

:artist_id字段是兩個類之間原始關聯的遺蹟。新的many_to_many關聯由event.artists [i]訪問(其中「i」只是從0到關聯的藝術家-1的整數索引)。顯然藝術家和事件類之間的原始關聯方法仍然存在?我的猜測是,解決方案不僅僅是使用內置到datamapper中的auto_upgrade方法,而是寫一個明確的遷移。如果有辦法處理對數據庫的這種類型的更改,並且仍然有auto_upgrade方法的工作,那就太好了!

如果您需要更多關於我的模型或任何東西的詳細信息,請詢問我很樂意添加它們。

回答

1

根據我的經驗,DataMapper的auto_upgrade不能很好地工作 - 或者至少可以說,它不能像我期望的那樣工作。如果你想添加一個新的列到你的模型,它會做它應該做的;嘗試對列做更復雜的事情,它可能不會像你期望的那樣行事。

例如,如果您創建了String類型的屬性,它最初將具有50個字符的長度。如果您注意到50個字符不足以容納您的字符串,則向該模型添加:length => 100將不足以使auto_upgrade更改列的寬度。

看來你已經絆倒了另一個缺點,雖然有人可能會爭辯說,在你的情況下,也許DataMapper的行爲並沒有那麼糟糕(想想遺留數據庫)。但事實是,當您更改關聯時,Eventartist_id列未被刪除,然後當您嘗試保存Event時,會出現錯誤,因爲數據庫表示它是必填字段。

請注意,您收到的錯誤不是驗證錯誤:DataMapper認爲一切看起來都正常,但在嘗試保存對象時從數據庫中收到錯誤。

希望這會有所幫助!

0

自動升級並不是一個缺點!我認爲自動升級是DataMapper的一項便利功能。據我所知,它的目的只是爲你添加列。因此,快速啓動項目以及管理測試和開發環境而無需編寫遷移,但不是用於對成熟的實時項目進行修改的最佳工具是非常好的。

爲此,DataMapper確實有遷移!使用dm-migrations gem。缺點是他們沒有很好的文件記錄...。實際上,我正致力於將當前的項目更改爲使用遷移,並且希望爲dm-migrations github wiki提供一些指導。但是,如果您尚未準備好切換到遷移,那麼也可以使用SQL客戶端手動更新列,然後繼續對新列使用自動升級。這就是我已經做了兩年在我的項目:)

+0

哈,是啊我也一直在本地刪除與navicat列,但我絕對想要得到適合在heroku上的應用程序的遷移工作。 – wuliwong 2012-04-12 16:28:10