Запрос вложенных вложенных документов с помощью mongoid (или альтернативы) - PullRequest
1 голос
/ 05 марта 2012

В настоящее время я храню серию твитов в виде документов в mongodb, схема которых напрямую отображается на json, возвращаемый потоковым API.

Схема очень многословна со многими вложенными вложенными документами, например,

{
  "_id": ObjectId("4f547c17e948fb6e2e00197d"),
  "key: value",
  "...",
  "...",
  "entities": {
    "urls": [
       {
        "indices": [
          58,
          78
        ],
        "display_url": "bit.ly\/yJwQsm",
        "url": "http:\/\/t.co\/x5ccL6So",
        "expanded_url": "http:\/\/bit.ly\/yJwQsm"
      }
    ],
  }
  "other parent key pair values here" 
}

Иногда встраиваемый URL-адрес будет пустым, в то время как в других случаях он будет содержать более одного значения (в следующем массиве, например, вложенность [0], [1] [n])

Я бы хотелчтобы извлечь значения ссылок из этого документа json.

У меня есть простое приложение Sinatra, в котором я определил модель твитов и, используя динамические атрибуты mongoid, я могу быстро выводить значения из документа следующим образом:

<% @tweets.each do |tweet| %>
<li><%= tweet._id %></li>
<li><%= tweet.user.screen_name %></li>
<li><%= tweet.entities %></li>

Когда я пытаюсь вывести значение типа

<li><%= tweet.entities.urls %></li>

, я начинаю видеть ошибки, когда метод не существует.Сам по себе вызов tweet.entities вернет содержимое вложенного встраивания.У кого-нибудь есть какие-либо идеи относительно того, как я могу проверить наличие встроенного ребенка, чтобы затем перейти к нему?Возможно ли то, что я пытаюсь сделать с помощью монгоида?Мой запрос на данный момент просто возвращает полный документ.

1 Ответ

1 голос
/ 05 марта 2012

Лучшим в вашем случае является переопределение метода entites для возврата пустой модели Entity, если нет ключа entities. Или вы можете создать новый метод entities_url, выполняя работу по проверке, если есть URL и или и возвращать значение, если есть URL

class Tweet

  def entities
    super || Entity.new
  end

  def entities_url
    entities.respond_to?(:url) ? entities.url : ''
  end

end
...