Ассоциации и коллекции с ревом - PullRequest
6 голосов
/ 02 марта 2012

Предположим, у нас есть что-то вроде:

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

Затем мы продолжаем делать что-то вроде этого:

user.extend(UserRepresenter).to_json

И все просто замечательно. Но как насчет:

User.all.to_json

или

company.extend(CompanyRepresenter).users.to_json?

или даже:

company.users.collect{|u| u.extend(UserRepresenter)}.extend(Representable::JSON::Collection).to_json

Результатом всегда является массив нормальных to_json записей Mongoid.

Вопрос в том, как получить что-то вроде Company.all.to_json, чтобы иметь Roared JSON, включая ссылки и другие дополнительные данные сериализации.

1 Ответ

8 голосов
/ 01 июня 2012

Оказывается, этого просто достичь, используя Представляемый (который используется Роаром):

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)
...