Трансформиране на JSON структура от данни в Rails

Наскоро завърших проект със съотборник във Flatiron, където разработихме едностранично приложение, използвайки JavaScript и Rails. Изискванията бяха доста отворени и ние се спряхме на изграждането на страница, която позволява на потребителя да взаимодейства с множество API от NASA Open API. Първо, наистина съм горд от това как се получи това, моля, вижте го в GitHub. Моят партньор, Кристофър Лемпке, и аз се забавлявахме много и наистина опънахме краката си с JavaScript и CSS (извличане на изобилие, условно изобразяване, плъзгане и пускане, анимации, най-якавата ръководена стъпка, която някога сте виждали). Второ, получихме възможността да се сблъскаме с това, което е много често срещан проблем, работейки с подобни данни в много различни формати.

Страницата ни изтегли информация от APOD (астрономическа снимка на деня), Библиотека с изображения и видео на НАСА и Insight (времето на Марс). Е, Insight в момента не функционира, така че за времето на Марс трябваше да заредим данни от тук (да, извличане на API от бекенда!). Освен това дадохме на потребителите възможността да запазват изображения и да ги показват на екрана. Това последното беше мястото, от което идваха проблемите ни с манипулирането на данни. Докато оригиналният източник за всички изображения беше библиотеката за изображения и видео на НАСА и ние заснехме цялата информация за всяко запазено изображение в нашата база данни на Rails, структурите бяха много различни. Нашата база данни предостави отговори на нашите заявки за извличане, които изглеждаха така

Прост списък от двойки ключове, стойности, лесно. НАСА от друга страна... организира данните малко повече:

Сега, първото нещо, което трябваше да направя, когато видях това, беше да напиша функция на JavaScript, за да го преобразувам в по-лесен формат. Но това ми даде възможност да практикувам работа с вложени структури от данни, така че взехме това, което ни беше дадено, и работихме с него (много от this.data[0].nasa_id и event.target.links[0].href).

Но проблемът се появи, когато исках да използвам повторно някои от моите функции, написани за изображенията на НАСА, върху изображения от нашата база данни на Rails. Отново, трябваше (и бих го направил, ако наистина трябваше да разположа и поддържам този проект) да се върна и да трансформирам данните на НАСА, но вместо това исках да видя дали мога да актуализирам отговора на Rails API, за да отразява това, което НАСА предоставя. След много яростно търсене в гугъл реших, че това или не се прави обикновено, или е толкова просто, че никой не си направи труда да го обясни. Имаше много въпроси относно включването на данни от свързани таблици,

render json: user.as_json(
       include:{ images: { except:  ["created_at", "updated_at"] }},
       except:  ["created_at", "updated_at"])

но нищо за това какво да направя, ако изображенията не са в правилния формат, така че оставих Google и всъщност се замислих какво се опитвам да направя. Имах Ruby хеш (или масив от хешове), който трябваше да манипулирам. След като наистина погледнах какво правя, беше лесно, написах прост ruby ​​метод в моя контролер, за да манипулирам данните,

и ако беше масив от изображения, използвах същата структура, но просто „картографирах“ масива.

И така, какво научих от това, първо щеше да ми е по-лесно просто да трансформирам данните на НАСА на предния край. По този начин всички мои методи използват проста структура, която е лесна за четене и актуализиране (също така, ако NASA актуализира своя API, има вероятност да трябва да актуализирам само една функция вместо 20). Това също би разтоварило обработката от моя сървър към локалния компютър на потребителя, правейки приложението по-мащабируемо. Но тъй като аз не прилагам това, а вместо това това е учебно упражнение, по-важният урок е как да подходя и разрешавам проблема. Помогна ми да упражня основите си (в този случай структури от данни и манипулиране на Ruby) и ми напомни, че не всеки отговор е в StackOverflow. Следващия път, когато се сблъскам с проблем, ще не забравя първо да го опиша с по-основни термини, да приложа основите, а след това, ако нямам добър отговор, да премина към StackOverflow.