(Этот пост был связан с завершением второго проекта учебной программы The Flatiron School.)

Два вниз, три идти.

В некотором смысле проект Sinatra был проще, чем CLI Gem, хотя он определенно создавал свой собственный набор проблем. Идя в совершенно ином направлении, чем мой CLI Gem, мой проект Sinatra состоит из динамического веб-приложения, в котором пользователи могут сохранять записи игр, которыми они владеют, вместе с их жанром и любыми заметками, которые они хотели бы сохранить в отношении них. что угодно, начиная от подробностей об их персонажах, прохождениях, общих советах для других пользователей или обзоров.

Я думаю, что разница в сложности связана с моим растущим знакомством с программированием, особенно с языком Ruby. После моей работы над CLI Gem я обнаружил, что отладка становится быстрее, и я могу быстрее найти место, где может быть проблема (помимо случайной опечатки или небольшого пуканья). Кроме того, я обнаружил, что большая часть работы с контроллерами, моделями и представлениями проходит довольно гладко. Были, конечно, проблемы с написанием этого кода, и я никоим образом не мог написать код в каждом файле за один раз, но я обнаружил, что обнаружение проблем было просто вопросом настойчивости и что я был относительно в состоянии предсказать результаты моего кода.

Самой большой проблемой для меня в этом проекте была организация моей базы данных, которую я, вероятно, реструктуризирую в будущем рефакторинге. Начнем с проблемы, связанной с характером проекта, которую я не знал, как решить: у пользователя есть много игр, а у игры много пользователей, а у игры много платформ, но только одна платформа по отношению к данному пользователю. . После нескольких разных попыток я пришел к следующему решению: у меня были бы две игровые модели, OwnedGame и ArchivedGame, где каждая из первых принадлежала бы только одному пользователю, таким образом, с ней была бы связана только одна платформа и заметки, которые пользователь добавил бы для своего журнала, и каждый из последних функционирует как внутренняя библиотека сайта, предоставляя список всех игр, о которых знает сайт, и всех платформ, для которых они доступны.

В некотором смысле я знаю, что это неэффективно, и планирую провести рефакторинг. Например, существует несколько экземпляров «одного и того же» OwnedGame, но принадлежащих разным пользователям, вместе с сопутствующим ArchivedGame, в котором хранится большая часть одной и той же информации. Однако со схемой, которую я выбрал, возникла проблема с сохранением и представлением нужных данных в каждом представлении (такие строки, как @owned_game = @user.owned_games.detect{|o_g| o_g == OwnedGame.find_by_slug(params[:slug])}, проверяли мою собственную осведомленность о возвращаемых значениях каждого из моих методов и о том, как получить правильную информацию в осмысленном виде). способ). Как бы я ни был доволен готовым продуктом, я также уже с нетерпением жду его рефакторинга с течением времени, чтобы сделать его еще более кратким и эффективным по мере роста моих знаний в области программирования.

Первоначально опубликовано на saurookadook.github.io.