假设我们有类似的东西:
class Company
include Mongoid::Document
has_many :users
field :name, type: String
end
class User
include Mongoid::Document
belongs_to :company
field :name, type: String
end
module CompanyRepresenter
include Roar::Representer::JSON
property :name
end
module UserRepresenter
include Roar::Representer::JSON
property :name
link :self do
user_url
end
end
Run Code Online (Sandbox Code Playgroud)
然后我们继续做这样的事情:
user.extend(UserRepresenter).to_json
Run Code Online (Sandbox Code Playgroud)
一切都很棒.但是怎么样:
User.all.to_json
Run Code Online (Sandbox Code Playgroud)
要么:
company.extend(CompanyRepresenter).users.to_json?
Run Code Online (Sandbox Code Playgroud)
甚至:
company.users.collect{|u| u.extend(UserRepresenter)}.extend(Representable::JSON::Collection).to_json
Run Code Online (Sandbox Code Playgroud)
结果始终是Mongoid正常to_json条目的数组.
问题是我如何获得类似Company.all.to_jsonRoared JSON的内容,包括链接和其他额外的序列化数据.
事实证明,使用Representable(由Roar使用)很容易实现:
require 'roar/representer/json'
module PostRepresenter
include Roar::Representer::JSON
property :id
property :title
end
require 'representable/json/collection'
module PostsRepresenter
include Representable::JSON::Collection
items extend: PostRepresenter
end
Post.limit(10).extend(PostsRepresenter)
Run Code Online (Sandbox Code Playgroud)