Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Помощь запрашивалНиколай СверчковНиколай Сверчков Николай Сверчков

ПомогАнтон ЛоктиковАнтон Локтиков Антон Локтиков

Бэк: gem Clowne: коллбек after_clone для обработки собранной модели

Для новичков, задача на несколько дней

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, смотрите в документации.

Инструкции по выполнению

  1. Сделать форк Clowne.
  2. Реализовать необходимый функционал и тесты.
  3. Добавить описание в документацию и обновить раздел “Overview”.
  4. Отправить pull request.