Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решен ие.
Для новичков, задача на несколько дней
Clowne — это Ruby gem для гибкого клонирования моделей.
Начиная с версии 1.0, Clowne поддерживает два коллбека для обработки клонируемой записи:
finalize
вызывается до сохранения записи в процессе формирования результата клонирования.after_persist
вызывается после сохранения записи для уже сформированной записи.Однако, существуют промежуточные ситуации, когда необходимо обработать собранную, но еще не сохраненную запись.
К примеру, чтобы избежать использования after_persist
и дополнительных операций c базой:
class UserCloner < Clowne::Cloner
# клонируем пользователя и его посты, которые являются черновиками
include_association :posts, scope: :draft
after_clone do |_origin, clone, mapper:, **|
# актуализируем значение атрибута пользователя
clone.draft_count = clone.posts.count
end
end
Альтернативным примером использования может послужить проверка собранной записи по некоторой бизнес-логике:
class UserCloner < Clowne::Cloner
include_association :posts, scope: :draft
after_clone do |origin, clone, errors:, **|
errors.unshift("user clone of #{origin.cache_key} is invalid") if clone.posts.empty?
end
end
errors = []
operation = UserCloner.call(user, errors: errors)
raise errors.join('; ') if errors.any?
Для покрытия подобного рода кейсов мы можно реализовать after_clone
коллбек.
Польза: прокачаться в Ruby, получить опыт работы со сложными Ruby библиотеками.
Советы по реализации
Имплементация after_clone
будет очень похожа на after_persist
, за исключением одного нюанса — вызов after_clone
должен происходить всегда (обратите внимание на Clowne::Utils::Operation#to_record
) и до сохранения записи.
Подробную информацию о том, как работает Clowne, смотрите в документации.
Инструкции по выполнению