Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решен ие.
Для уверенных в себе, задача на несколько дней
В ActiveRecord предусмотрено несколько методов для предварительной загрузки ассоциированных записей (такие как includes
, eager_load
и другие). Это позволяет выгружать данные, избегая так называемой проблемы N+1 запросов.
В некоторых случаях мы не знаем заранее, какие ассоциации нам понадобятся при выполнении запроса (простой пример — работа с GraphQL).
Приходится либо предзагружать лишние данные (например, указывая все ассоциации в includes
), либо использовать альтернативные подходы, такие как batch loading.
Необходимо написать ленивую реализацию метода preload
, которая предзагружает ассоциации только если они используются.
Польза: детально узнать, как работает Rails и ActiveRecord изнутри, принести пользу Rails-сообществу.
Пример работы
class User < ApplicationRecord
has_many :posts
end
class Post < ApplicationRecord
has_many :comments
belongs_to :user
end
class Comment < ApplicationRecord
belongs_to :user
belongs_to :post
end
# Инициируем выборку: выгружаем пользователей с публикациями,
# комментариями и авторами комментариев
users = User.lazy_preload(posts: { comments: :user } ).limit(10)
# Будет выполнен один запрос
#=> SELECT * FROM users LIMIT 10
users.each do |user|
# Запрос на загрузку постов будет выполнен при первом
# обращении к ассоциации на любом пользователе,
# но записи будут загружены сразу для всех пользователей
#
# SELECT * FROM posts WHERE user_id in (...)
user.posts.each do |post|
p post.title
end
end
# Комментарии не будет предзагружены, так как мы к ним не обращались.