Python 的世界里没有代码块

以前经常写 ruby 和 js, 对于以下的代码非常习惯: item = {id: 1, name: 'Donald Clinton'} attrs = [:id, :name] attr_getters = attrs.map do |attr| lambda do "The #{attr} is #{item[attr]}" end end > attr_getters[0][] "The id is 1" > attr_getters[1][] "The name is Donald Clinton" var item = {id: 1,…

Read More

Automatic Eager Loading for Mongoid

Even in MongoDB, sometimes your models may still have reference relations. Like ActiveRecord, the popular MongoDB ORM, mongoid, provides #includes method to perform eager loads. Problems However, it is a pain to specify them manually in codes. In most scenes, you just need the eager loading when you what to…

Read More

Using ES6 style {a, b, c} hash construct in Ruby

ES6 ships with a very handy syntax sugar to build Object(aka Hash in Ruby). var year = 2016; var month = 3; var day = 30; var theDate = { year, month, day }; Can I use the syntax in ruby? calling something simple as HandyHash(:year, :month, :day)? To get the variable values, the…

Read More

森的妖精 GraphQL

最(好几个)近(月之前), 在公司前端同学的推荐下接触了GraphQL, 感觉一阵清爽. 如今使用了一段时间, 可以汇报一下使用感受. GraphQL? 物如其名, GraphQL 是一种 Query Language, 由世界上最好语言的领军者 Facebook 公司发明. 它的出现是为了满足服务端向客户端灵活输出数据的需要. Restful API 不行吗? 当然行. Restful 是包括我在内, 各位后端同学都非常熟悉的朋友. 从早年凭感觉写的jsp, asp们, 到后来做的 WebService API, 再到有哲学思想指导的 Restful API. 可以很明显的感觉到, 这些前后端的数据交互都是由后端在主导. 后端决定了数据格式, 决定了每个请求所能得到的数据. 可是! 时代不再是做个门户, 做个页面这么简单了. 如今更注重的是客户端侧的数据交互. 看看隔壁js们的各种前端框架, SPA, 数据绑定, MVVM 搞得热火朝天. 虽然后端依然承载着业务处理, 数据安全这样核心的功能. 但是客户端才是数据的需求方, 前端更清楚,…

Read More

Grape自定义参数类型

Grape的params函数是非常方便用于定义API参数的工具. 这次做到一个接口要传入GeoJSON格式的参数. 与世界在接口上直接写了: params do requires :location, type: GeoJSONPoint, desc: "地点" end class GeoJSONPoint attr_accessor :type, :coordinates def initialize(coordinates=[]) @coordinates = coordinates end # always a point def type "Point" end end 不过这样显然是不行的, 一定会出400 Bad Request. Grape毕竟不知道GeoJSONPoint这个类是怎么转换的. 读了读Grape的代码, 发现Grape是用 Virtus 这个gem来转换参数=>对象的. 于是这个GeoJSONPoint的类就需要用Virtus的方式来定义. 于是代码变成了 class GeoJSONPoint include Virtus.model attribute…

Read More