Атрибуты модели Mongodb mongoid, отсортированные по алфавиту, а не по порядку вставки - PullRequest
1 голос
/ 08 мая 2011

У меня есть модель User, где я активно использую динамические атрибуты.Когда я показываю пользовательское шоу, я пропускаю первый набор атрибутов, чтобы пропустить идентификатор и т. Д. Проблема заключается в том, что атрибуты сортируются по алфавиту, а не по порядку создания, поэтому, например, если я создаю пользователей как:


MONGODB startuplab_co_development['users'].insert([{"provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "_id"=>BSON::ObjectId('4dc5ad606acb26049e000002'), "email"=>"dan@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio"}])

Несмотря на то, что второй атрибут вставки равен uid, при извлечении ключей они сортируются в алфавитном порядке.


%h1 User
%ul
-keys = @user.attributes.keys[3..-1]
- keys.each do |key|
  %li
    %span
      %strong= "#{key.capitalize()}:"
    %span= "#{@user[key]}"

Так, например, при этом они будут печатать UID как последний атрибут, поскольку они были отсортированы.


First_name: Daniel
Last_name: Palacio
Name: Daniel Palacio
Provider: google
Uid: https://www.google.com/accounts/o8/id?id=AItOawl_oas_8jcY1VSTQchsc 

В любом случае я могу убедиться, что положение атрибутов остается в порядке вставки?

Вот цепочка событий, в которой атрибуты сортируются

  1. После создания uid является 3-м атрибутом


ruby-1.9.2-p0 > user = User.first
 => _id: 4dc5c5946acb26049e000005, _type: nil, _id: BSON::ObjectId('4dc5c5946acb26049e000005'), provider: "google", uid: "https://www.google.com/accounts/o8/id?id=AItOawl_oas_", admin: nil, email: "danpal@gmail.com", first_name: "Daniel", last_name: "Palacio", name: "Daniel Palacio"> 

ruby-1.9.2-p0 > user.attributes
 => {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "email"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio"} 

  1. Теперь мы обновляем атрибут admin и сохраняем его, uid по-прежнему является 3-м атрибутом


ruby-1.9.2-p0 > user.update_attributes(:admin => true)
 => true 
ruby-1.9.2-p0 > user.attributes
 => {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "email"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "admin"=>true} 

ruby-1.9.2-p0 > user.save
 => true 

ruby-1.9.2-p0 > user.attributes
 => {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "email"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "admin"=>true} 

  1. Помните, что мы снова получаем объект из базы данных, теперь uid является последним атрибутом, и они были отсортированы по алфавиту.


ruby-1.9.2-p0 > user = User.first
 => # 
ruby-1.9.2-p0 > user.attributes
 => {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "admin"=>true, "email"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_"} 

1 Ответ

4 голосов
/ 08 мая 2011

Хорошо, вот ответ:

В основном во время обновления, если выделенного пространства для документа недостаточно (например, обновление добавляет новое поле или увеличивает существующее поле), документ будет перемещен иполя переупорядочены (в алфавитно-цифровом порядке).

Из документов MOngoDB: http://www.mongodb.org/display/DOCS/Updating

Порядок (пере) полей

Во время обновления порядок полейизменилось.Нет гарантии, что порядок полей будет постоянным или таким же после обновления.В настоящий момент, если обновление может быть применено на месте, порядок будет таким же (с добавлением, добавленным в конце), но если для документа требуется перемещение (если выделенного в настоящее время пространства недостаточно для обновления)тогда поля будут переупорядочены (в алфавитном порядке).

...