各位,关于 自定义 model, 就是不用 AR 或者 DataMapper,基于 ruby class 实现 model 功能,支持 属性访问,增删改查等功能,大家有什么想法?主要是我的数据都是通过 api 调用获取,并不是直接读数据库,所以应该不能直接用 AR 这类东西。但我又不想从头写 model, 不知道 ruby 有什么方便的方法来做这个?
提问次数比较少,可能上面说的有点乱,也不知道该怎么表达了。
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
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 的时候有个参考。
#6 楼 @everpointer 从简单做法做起,用一个 Module 放 API 相关的方法,多了之后划分多个 Module,需要保留状态就改成用 Class。
谢谢 @Rei , 简短的几句话,感觉却很对。我一开始学 Rails,然后又去用 Sinatra, 但是到现在对 Ruby 基础知识的掌握还混乱不堪,Module 也没用。感觉有 Module 和 Class 的使用经验,也就不需要提问了。 从简单做起,我先实现简单的方案就好了。
本质是对 api 操作和数据的本地封装;如果本地的应用庞大而且和 api 交互的方式多,可以用类似 gem 的做法,用和 api 操作类似的接口,可以参见 Github, Twitter 等的 gems; 如果本地于 api 的交互不多建议封装的时候用贴近本地业务的名字和数据封装
大家有谁在做手机版网页商城啊,我现在在做,为我们的微信公众号弄的。 后端的功能,都由 ecshop 的 API 支持,商品管理什么的都由 ecshop 的后台来做。 与微信接口交互以及 mobile 版页面的生成由 ruby 来做。 (不过感觉好像直接用 php 就好了,也不需用试用 API,有点为了用 ruby 而这么做的感觉。。。)
不管了,如果有人跟我做同样的事情的,可以交流下哈。这东西有用的话,也可以开源哈, 微商城还是很多人有需求的吧。
努力努力,不扯了,继续工作了,这几天要把这个东西弄出来呢。