Mongoid пакетная вставка не использует ключ - PullRequest
1 голос
/ 07 февраля 2012

Я использую Mongoid для проекта и пытаюсь использовать функцию пакетной вставки, выполнив:

Person.collection.insert(friends)

Где у друзей массив хешей.

К сожалению, я пытаюсь использовать функцию ключа Mongoid для установки идентификатора каждого объекта на свой идентификатор пользователя Facebook. Вот код:

def process_friends(type, friends)
  unless friends
    @graph = Koala::Facebook::API.new(self.token)

    friends = @graph.get_connections('me','friends', {'fields' => 'id,name,picture,education,location,gender'})
  end

  friends.each do |friend|
    friend[:u_id] = friend["id"]
    friend.delete "id"
  end

  Person.collection.insert(friends)
  self.update_attributes( process_status: {status: "success", type: type})
end

и в моём определении модели Person:

  key :u_id

Это работало, когда я перебирал всех друзей и добавлял их по отдельности, но теперь, когда я перешел к пакетной вставке, он не устанавливает идентификатор каждого человека в u_id.

Есть идеи?

1 Ответ

2 голосов
/ 08 февраля 2012

Model.collection возвращает внутреннюю коллекцию (драйвер ruby) вместо использования mongoid. Пакетная вставка должна быть выполнена таким образом, потому что она не поддерживается самим mongoid.

По сути, напрямую обращаясь к коллекции, вы обходите mongoid, и поэтому тот факт, что вы объявляете key :u_id, не имеет (и не должен) никакого эффекта.

Решение состоит в том, чтобы просто использовать _id вместо u_id, чтобы драйвер не пытался сгенерировать его для вас.

friends.each do |friend|
  friend[:_id] = friend["id"]
  friend.delete "id"
end

Однако это может иметь последствия в других местах вашего кода.

Другое решение, если вы ленивы, это просто не заботиться о дополнительном object_id и позволить драйверу создать его для вас.

...