新手问题 如何实现基于 API 数据源的 model,不通过 AR 后者 DataMapper 来做?

everpointer · 2013年10月19日 · 最后由 everpointer 回复于 2013年10月19日 · 2544 次阅读

各位,关于 自定义 model, 就是不用 AR 或者 DataMapper,基于 ruby class 实现 model 功能,支持 属性访问,增删改查等功能,大家有什么想法?主要是我的数据都是通过 api 调用获取,并不是直接读数据库,所以应该不能直接用 AR 这类东西。但我又不想从头写 model, 不知道 ruby 有什么方便的方法来做这个?

提问次数比较少,可能上面说的有点乱,也不知道该怎么表达了。

继续 Google, 等待好心人帮助。

goolge 找到了 ActiveModel::Serializers::JSON,可以通过 json 创建对象,但没有找到调用 api 获取数据创建对象的案例,还是不太确定。找到的代码如下:

class Person
  include ActiveModel::Serializers::JSON

  attr_accessor :name, :age, :awesome

  def attributes=(hash)
    hash.each do |key, value|
      instance_variable_set("@#{key}", value)
    end
  end

  def attributes
    instance_values
  end
end

json = { name: 'bob', age: 22, awesome:true }.to_json
person = Person.new
person.from_json(json) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob">
person.name            # => "bob"
person.age             # => 22
person.awesome         # => true

不需要创建对象,获取 json 就直接当 hash 用行了。

require 'json'

JSON.parse "{\"name\":\"bob\",\"age\":22,\"awesome\":true}"
# => {"name"=>"bob", "age"=>22, "awesome"=>true}

将问题拆解一下。 你拿到的数据如果不直接存到数据,那么你需要设计一个自己的 class。如果你不想被其他的 class 造成干扰,比如同名,可以用 module 再包装下。 处理完的数据,保存时,再调用 AR 的 model。 你的逻辑,可能也不需要放到 app/models/ 里边,可以放到 lib,或者一个简单的 gem 里。我常放到 lib 里。

希望我的想法让呢 google 的时候有个参考。

谢谢 @Rei @liwei78 的回复,一直在 google,刚看到,以为石沉大海了。 仔细想了下,直接 parse json 数据拿来用就好。 我这里本地不存数据,都是 API 操作远程服务来改数据。 我在弄的是一个基于 ecshop API 的手机网页客户端,可能我的需求应该是把各种 API 分装成 一个类,比如操作商品,就把商品查询,商品详情等相关 api 分装成一个商品 API 类。 大家在做类似我这种基于 API 的应用,都是怎么操作的,有什么案例可以参考码?

#6 楼 @everpointer 从简单做法做起,用一个 Module 放 API 相关的方法,多了之后划分多个 Module,需要保留状态就改成用 Class。

谢谢 @Rei , 简短的几句话,感觉却很对。我一开始学 Rails,然后又去用 Sinatra, 但是到现在对 Ruby 基础知识的掌握还混乱不堪,Module 也没用。感觉有 Module 和 Class 的使用经验,也就不需要提问了。 从简单做起,我先实现简单的方案就好了。

本质是对 api 操作和数据的本地封装;如果本地的应用庞大而且和 api 交互的方式多,可以用类似 gem 的做法,用和 api 操作类似的接口,可以参见 Github, Twitter 等的 gems; 如果本地于 api 的交互不多建议封装的时候用贴近本地业务的名字和数据封装

《元编程》第一章就是讲这些了。

#9 楼 @knwang 您说的是接口的封转应该基于本地业务还是和 API 类似。应该使用的是商城的 API 的,应该算是比较复杂的,感觉 gem 封转是有必要的。 不过鉴于我现在的能力(根本没写过 Gem...), 而且本地业务其实也 API 差不多,还是先封转借个 API,先用着。 数据封转的话,感觉直接用 Hash 就可以了,因为主要用于一些展示,接口中用到的参数也都是 1,2 个,比较简单。

PS: 好兴奋,第一次收获这么多回帖,感谢感谢。

大家有谁在做手机版网页商城啊,我现在在做,为我们的微信公众号弄的。 后端的功能,都由 ecshop 的 API 支持,商品管理什么的都由 ecshop 的后台来做。 与微信接口交互以及 mobile 版页面的生成由 ruby 来做。 (不过感觉好像直接用 php 就好了,也不需用试用 API,有点为了用 ruby 而这么做的感觉。。。)

不管了,如果有人跟我做同样的事情的,可以交流下哈。这东西有用的话,也可以开源哈, 微商城还是很多人有需求的吧。

努力努力,不扯了,继续工作了,这几天要把这个东西弄出来呢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号