У меня есть следующий метод в моем ContactsController
:
def index
@contacts = {}
company = current_employer.company
groups = company.groups.pluck(:name)
contacts = company.contacts.order(last_name: :asc)
contacts.each do |contact|
@contacts[contact.id] = contact.as_json
@contacts[contact.id][:groups] = {}
contact_groups = contact.groups.pluck(:name)
groups.each do |name|
@contacts[contact.id][:groups][name] = contact_groups.include?(name)
end
end
binding.pry
respond_to do |format|
format.json { render json: { contacts: @contacts } }
end
end
Это генерирует хэш @contacts
, где ключами являются идентификаторы контактов, но хэш упорядочен по фамилии контакта. Если я вставлю binding.pry, я увижу, что хэш находится в правильном порядке, который ожидает мой клиент, однако после его рендеринга хэш переупорядочивается по идентификаторам контактов.
Вот пример того, как выглядит @contacts
:
{
contacts: {
24: {
id: 24,
first_name: "Foo",
last_name: "Bar",
email: "[email protected]",
groups: {
Test: true,
Random: false,
Example: false
}
},
31: {
id: 31,
first_name: "Jackie",
last_name: "Chan",
email: "[email protected]",
groups: {
Test: false,
Random: true,
Example: false
}
},
28: {
id: 28,
first_name: "Jason",
last_name: "Rebourne",
email: "[email protected]",
groups: {
Test: false,
Random: false,
Example: true
}
}
}
}
Обычно это желательное поведение, однако в этом случае я хотел бы отключить его, чтобы избежать дополнительной итерации ответа на стороне клиента. Как я могу предотвратить переупорядочение хэша?
Примечание. У меня нет специального сериализатора для моих классов Contact
или Group
.
Изменить
Это не дублирующий вопрос. Я хочу вернуть пользовательскую структуру JSON, а не стандартную сериализованную структуру, о которой идет речь в связанном «дублированном» вопросе.