Глубокая вложенность Rails 3.1 с RABL

Я использую гем RABL для отображения пользовательских данных JSON для пользователей комментариев, которые являются дочерними элементами аннотаций, которые являются дочерними элементами изображений. Я хотел бы сделать что-то похожее на:

object @image

node :annotations do
  @image.annotations.map { |a| {
    :id => a.id,
    :x1 => a.x1,
    :x2 => a.x2,
    :y1 => a.y1,
    :y2 => a.y2,
    node :comments do
      @image.annotations.comments.map { |c| {
       :body => c.body, 
       :user_id => c.user_id,
       :name => User.find(c.user_id).name,
       :user_icon => user_icon(User.find(c.user_id), 'square', 30)
      }} 
    end
  }}
end

Я знаю, что это недопустимо в RABL, я также пытался использовать дочерний узел вместо узла, но не смог таким образом получить доступ к пользовательским данным. Как мне это сделать и какой правильный синтаксис для этого?


person ramz15    schedule 24.02.2012    source источник


Ответы (1)


Я получил этот ответ от @calvin-l. Хитрость заключалась в том, чтобы просто отобразить a.comments, а затем получить данные из каждого комментария таким образом:

node :annotations do
  @image.annotations.map { |a| {
    :id => a.id,
    :x1 => a.x1,
    :x2 => a.x2,
    :y1 => a.y1,
    :y2 => a.y2,
    :comments => a.comments.map { |c| {
      :body => c.body,
      :created_at => c.created_at,
      :user => {
        :id => c.user.id,
        :facebook_id => c.user.facebook_id,
        :name => c.user.name,
        :username => c.user.username
      }
    }}
  }}
end
person ramz15    schedule 24.02.2012
comment
+1. этот способ создания хеша в блоке экономит пару строк, но это несколько сбивает с толку (и неидиоматично). Я собирался обновить его, но, думаю, все не так уж и плохо. - person tokland; 13.12.2012