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

everpointer · October 19, 2013 · Last by everpointer replied at October 19, 2013 · 2556 hits

各位,关于 自定义 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 而这么做的感觉。。。)

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.