Ruby on rails rails中的数据结构版本控制

Ruby on rails rails中的数据结构版本控制,ruby-on-rails,data-structures,migration,versioning,Ruby On Rails,Data Structures,Migration,Versioning,首先是免责声明:不知道我是否在尝试不可能的事情 我们的rails(2.3.12)应用程序正在快速发展。这个小家伙已经有超过20个型号和超过100个迁移。此应用程序的任务之一是提供API。我们目前正在引入一个API版本控制方案,其思路如下: 但是,除了拥有不同版本的控制器外,我们还希望拥有不同版本的models/db表。例如,在API的V1.0版本中,我们提供了一种获取所有汽车的JSON列表的方法,比如: http://we.com/v1.0/cars/ class car attr_ac

首先是免责声明:不知道我是否在尝试不可能的事情

我们的rails(2.3.12)应用程序正在快速发展。这个小家伙已经有超过20个型号和超过100个迁移。此应用程序的任务之一是提供API。我们目前正在引入一个API版本控制方案,其思路如下:

但是,除了拥有不同版本的控制器外,我们还希望拥有不同版本的models/db表。例如,在API的V1.0版本中,我们提供了一种获取所有汽车的JSON列表的方法,比如:

http://we.com/v1.0/cars/
class car
   attr_accessible :maker, :country
end
http://we.com/v2.0/cars
class car
    attr_accessible :make, :country_code, :country_name
end
为此,我们有一个汽车模型(以及相应的迁移),如下所示:

http://we.com/v1.0/cars/
class car
   attr_accessible :maker, :country
end
http://we.com/v2.0/cars
class car
    attr_accessible :make, :country_code, :country_name
end
现在,对于API的版本2,我们希望API调用如下所示:

http://we.com/v1.0/cars/
class car
   attr_accessible :maker, :country
end
http://we.com/v2.0/cars
class car
    attr_accessible :make, :country_code, :country_name
end
模型看起来是这样的:

http://we.com/v1.0/cars/
class car
   attr_accessible :maker, :country
end
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_版本等在这里没有解决方案)

是否可以同时使用这两种型号?我的意思是,有没有一种聪明的方法可以在相同的数据上使用两个版本的模型?像“decorator”或“adapter”这样的模式出现在脑海中,我只是没有找到任何示例。但考虑到我们有一个转换器方法(在我们的示例中),它可以转换

[:country] to [:country_code, :country_name]
反之亦然,不是吗


可能吗?你知道有什么宝石可以解决这个问题吗?

我认为没有现成的解决办法来解决这类问题。我认为维护api版本的最佳方法是:


为所有API版本创建一个可靠的验收测试套件。(它应该将您的API视为黑盒-不应该有任何实现细节,如字段名等),这将解决您的问题-您可以在不改变行为的情况下更改旧版本的API实现细节。因此,在您的示例中,当您决定更改字段名时,您的测试套件将立即向您显示您的API已损坏,您必须调整其实现(但不是外部行为!)。我认为这比维护不同的模型版本要容易得多,我认为这几乎是不可能的,而且是多余的。

我不认为有解决此类问题的现成方法。我认为维护api版本的最佳方法是:


为所有API版本创建一个可靠的验收测试套件。(它应该将您的API视为黑盒-不应该有任何实现细节,如字段名等),这将解决您的问题-您可以在不改变行为的情况下更改旧版本的API实现细节。因此,在您的示例中,当您决定更改字段名时,您的测试套件将立即向您显示您的API已损坏,您必须调整其实现(但不是外部行为!)。我认为这比维护不同的型号版本要容易得多,我认为这几乎是不可能的,而且是多余的。

如果你有一种将
[:country]转换为[:country\u code,:country\u name]
的方法,就像你说的,我看不出有问题。您只需确保每个API的控制器返回正确的内容


我不知道您是如何生成JSON的,但您可能只需要编写方法,如
@car.to\u JSON\u 1\u 0
@car.to\u JSON\u 2\u 0
或将版本作为参数传递给JSON转换方法。

如果您有一种方法可以像您所说的那样将
[:country]转换为[:country\u code,:country\u name]
,我看没问题。您只需确保每个API的控制器返回正确的内容


我不知道您是如何生成JSON的,但您可能只需要编写方法,如
@car.to_JSON_1_0
@car.to_JSON_2_0
或将版本作为参数传递给JSON转换方法。

测试API功能的黑盒是给定的。我看不出这如何解决我们维护不同版本的问题。黑盒测试API功能是一个给定的问题。我不知道这如何解决我们维护不同版本的问题。我喜欢你实现JSON序列化程序不同版本的想法。你知道有什么gem可以简化这项工作吗?我认为没有必要单独使用gem,你只需在Ruby哈希上调用
来_json
。我喜欢你实现不同版本的json序列化程序的想法。你知道有什么gem可以简化这项工作吗?我认为没有必要单独使用gem,你只需在Ruby哈希上调用
来实现json