Java Rails应用程序,但所有数据层都使用基于json/xml的web服务

Java Rails应用程序,但所有数据层都使用基于json/xml的web服务,java,ruby-on-rails,ruby,json,jersey,Java,Ruby On Rails,Ruby,Json,Jersey,我有一个用Java/Jersey编写的web服务层,它提供JSON服务 对于应用程序的前端,我想使用Rails 我应该如何着手构建我的模型 我应该这样做吗 response = api_client.get_user(123) User user = User.new(response) 将JSON映射到Ruby对象的最佳方法是什么 我有什么选择?由于这是一个关键部分,我想知道我的选择,因为性能是一个因素。这与将JSON映射到Ruby对象以及从Ruby object=>JSON开始是应用程序

我有一个用Java/Jersey编写的web服务层,它提供JSON服务

对于应用程序的前端,我想使用Rails

我应该如何着手构建我的模型

我应该这样做吗

response = api_client.get_user(123)

User user = User.new(response)
将JSON映射到Ruby对象的最佳方法是什么

我有什么选择?由于这是一个关键部分,我想知道我的选择,因为性能是一个因素。这与将JSON映射到Ruby对象以及从Ruby object=>JSON开始是应用程序中常见的情况


我还能使用验证吗?或者,由于我将在前端和服务层上复制验证,这难道没有意义吗?

Rails中的模型不必执行数据库操作,它们只是普通类。通常,当您从ActiveRecord::Base中对它们进行子类化时,它们就充满了ActiveRecord魔力

您可以使用这样的gem,它将为您提供具有属性的模型。对于验证,您可以使用。如果您想要接近
ActiveRecord
但没有数据库且正在运行Rails 3+,您还可以将
ActiveModel
包含到您的模型中,以获取属性和验证,并使它们以表单的形式工作。有关详细信息,请参阅

在您的情况下,这将取决于您将使用的数据。例如,如果所有数据源都具有相同的基本格式,则可以创建自己的基类,以保留希望在各个类之间共享的所有逻辑(继承)

如果您有一些不同类型的数据,您可以创建模块来封装不同类型的行为,并在适当的类(组合)中包含您需要的模型

通常情况下,您可能希望在远程API中每个资源都有一个类,该类与您拥有的域逻辑一一对应。您可以通过许多不同的方式来实现这一点,但是遵循ActiveRecord使用的方法命名可能是一个好主意,因为您在构建类结构时学习了ActiveRecord,并且如果您的API看起来和工作方式与ActiveRecords类似,它将帮助其他Rails开发人员

根据您希望对对象执行的操作来考虑它(这就是TDD的用武之地)。您希望能够获取集合
模型。所有
,特定元素
模型。查找(标识符)
,将更改的元素推送到远程服务
更新的\u模型。保存
,等等

这些方法内部的实际逻辑将取决于远程服务。但是,您可能希望每个模型类都保存一个指向其资源端点的url,并且您可能希望在模型中保留逻辑。因此,不是:

response = api_client.get_user(123)

User user = User.new(response)
你会的

class User
  ...
  def find id
    @api_client.get_user(id)
  end
  ...
end

User.find(123)
或者更可能

class ApiClient
  ...
  protected

  def self.uri resource_uri
    @uri = resource_uri
  end

  def get id
    # basically whatever code you envisioned for api_client.get_user
  end
  ...
end

class User < ApiClient
  uri 'http://path.to.remote/resource.json'
  ...
  def find id
    get(id)
  end
  ...
end

User.find(123)
类ApiClient
...
受保护的
def self.uri资源\u uri
@uri=资源\ u uri
结束
def获取id
#基本上,无论您为api_client.get_用户设想了什么代码
结束
...
结束
类用户
基本原则:收集类(ApiClient)中的所有共享逻辑。基于每个资源(用户)的子类。保留模型中的所有逻辑,系统的任何其他部分都不必知道它是DB支持的应用程序还是使用外部REST API。最重要的是,如果可以将集成逻辑完全保留在基类中。这样,如果外部数据源发生更改,您只有一个地方可以更新

另一方面,Rails有几种很好的方法将对象转换为JSON。从to_json方法到使用gem(如RABL)为json对象提供实际视图

您可以使用部分ActiveRecord模块来获得验证。从Rails4开始,这是一个名为ActiveModel的模块,但是您可以在Rails3中完成,并且有几个在线教程,其中包括一个

除了调用远程服务时可能发生的问题外,性能不会是一个问题,如果网络速度较慢,您将无法使用。缓存可能有助于解决其中一些问题(有关详细信息,请参阅),但这也取决于您使用的数据

希望这能让你走上正轨。如果你想更彻底地了解如何设计这种结构,你应该读一本关于这个主题的书,比如Sandi Metz