2011-07-28 90 views
0

首先聲明:不知道我是否在這裏嘗試不可能的事情。數據結構的版本控制

我們的rails(2.3.12)應用程序正在快速成長。這個小丑已經有了> 20個模型和> 100個遷移。此應用程序的任務之一是提供一個API。我們目前正在引入一個API版本控制方案:Best practices for API versioning?

但是,除了具有不同版本的控制器之外,我們還希望具有不同版本的模型/數據庫表。在例如API的版本爲V1.0,我們提供的方法來獲取所有汽車的JSON列表,讓我們說這樣的事情:

http://we.com/v1.0/cars/ 

對於這一點,我們有一個汽車模型(根據遷移)看起來像這樣:

class car 
    attr_accessible :maker, :country 
end 

現在的API的版本2,我們希望我們的API調用看起來像這樣:

http://we.com/v2.0/cars 

和模型看起來像這樣:

class car 
    attr_accessible :make, :country_code, :country_name 
end 

我希望你能得到照片。我不明白的(或者還沒有正確的想法)是:

我是否必須創建兩個模型才能使用命名空間?例如。

app/models/v1.0/car.rb 
app/models/v2.0/car.rb 

...或者我可以以某種方式有一個尊重數據結構版本的模型? (注意:我不打算版本化我的模型實例,vestal_versions等在這裏沒有解決方案)

是否可以同時使用這兩個模型?我的意思是,在相同的數據上使用兩個版本的模型有一個聰明的方法嗎?想到像'裝飾者'或'適配器'這樣的模式,我還沒有找到任何例子。但鑑於我們有一個轉換器方法(在我們的例子中),將轉換

[:country] to [:country_code, :country_name] 

反之亦然,不會工作嗎?

這可能嗎?你知道一個處理這個問題的寶石嗎?

回答

1

我不認爲有這樣的問題的烘焙解決方案。我認爲維護api版本的最佳方式是:

爲所有API版本創建可靠的驗收測試套件。 (它應該將您的API視爲黑盒子 - 不應該有任何實現細節,如字段名稱等)。這將解決您的問題 - 您將能夠更改舊版本API實施細節,而不會改變行爲。因此,在您決定更改字段名稱的示例中 - 您的測試套件會立即顯示您的API已損壞,並且必須調整其實施(但不是外部行爲!)。我認爲這應該比更容易比維護不同的型號版本,我認爲這幾乎是不可能的和多餘的。

+0

黑盒測試API功能是給定的。我不明白這是如何解決我們維護不同版本的問題。 –

2

如果你有像你說的那樣轉換[:country] to [:country_code, :country_name]的方法,我沒有看到問題。你只需要確保每個API的控制器都返回正確的東西。

我不知道您是如何生成您的JSON,但您可能只需編寫諸如@car.to_json_1_0@car.to_json_2_0之類的方法或將該版本作爲參數傳遞給JSON轉換方法。

+0

我喜歡你實現不同版本的JSON序列化器的想法。你知道任何簡化這項工作的寶石嗎? –

+0

我不認爲一個單獨的寶石是真的必要的,你可以簡單地在Ruby哈希上調用'to_json'。 – Karl