Привет, люди Ruby, это я, Саджад Умар, ваш личный Desi Developer, который приносит вам все обновления из мира #rubyonrails.

🎂🎂🎂🎂 Это наша первая годовщина 🎂🎂🎂🎂

Это 13-й выпуск Ruby on Rails Monthly, поэтому этому #новостному бюллетеню исполняется 1 год — 🎂Поздравляю меня и всех подписчиков.

За последние 12 месяцев мы выросли с 0 до семьи из 2000+ подписчиков, что очень важно, по крайней мере, для меня.

Если вы сочтете этот информационный бюллетень полезным, поделитесь им в своем кругу (LinkedIn, Twitter или где угодно) с некоторыми своими мыслями о новостном бюллетене. Я бы посчитал это подарком на годовщину от всех вас.

Ссылка общего доступа: https://bit.ly/rubyonrails-monthly

С учетом сказанного позвольте мне начать с некоторых обновлений от Ruby on Rails — The Rails Foundation.

Открыт конкурс Rails World Call for Papers

Rails World — первая конференция, организованная Rails Foundation и приуроченная к 20-летию фреймворка Ruby on Rails. Мероприятие состоится 5 и 6 октября 2023 года в Beurs van Berlage в Амстердаме, Нидерланды.

Этот CFP открыт до 16 июня, и мы стремимся сообщить всем заявителям, приняты они (или нет) до того, как билеты будут выпущены.

Ваши предложения сюда.

Все подробности читайте здесь.

AppSignal — новый участник The Rails Foundation.

AppSignal — третья компания, присоединившаяся к The Rails Foundation в качестве участника.

Все подробности читайте здесь.

Билеты на Rails World

Если вы хотите получать уведомления, когда билеты на Rails World поступят в продажу, добавьте себя в список ожидания здесь.

Библия интервью Ruby on Rails

Мой друг Nezir Zahirović написал несколько очень удобных руководств/электронных книг по подготовке к интервью. Я ознакомился с содержанием одной из этих электронных книг под названием The Ruby on Rails Interveiw Bible. и я могу сказать вам, что у него есть очень хорошая коллекция вопросов для интервью по ruby ​​on rails.

Вы можете купить эти электронные книги здесь

Trilogy, MySQL-совместимый клиент БД, теперь имеет свой адаптер для рельсов.

Клиент базы данных Trilogy и соответствующий адаптер Active Record были открыты GitHub в прошлом году. Shopify успешно внедрил Trilogy в монолит Rails несколько недель назад.

Два основных приложения Rails успешно запустили Trilogy, и это был идеальный момент для создания собственного адаптера.

Все подробности читайте здесь.

Улучшена проверка длины пароля в модуле ActiveModel::SecurePassword.

Этот запрос на вытягивание был создан, поскольку мы обнаружили необходимость улучшить проверку длины пароля для совместимости с BCrypt в модуле ActiveModel::SecurePassword.

Текущая проверка учитывает только количество символов, что может неточно отражать ограничение размера байта, установленное BCrypt.

Все подробности читайте здесь.

Уменьшено количество захватов в ActiveSupport::Inflector#underscore

Этот запрос на слияние изменяет gsub! в ActiveSupport::Inflector#underscore не использовать захваты.

Это пропускает создание небольших строк по $1/$2 и добавление символа подчеркивания, а вместо этого исключает символ, который нужно сохранить, из цели замены.

Все подробности читайте здесь.

При загрузке фикстур теперь отображается причина ошибки внешнего ключа.

Rails проверяет внешние ключи при создании фикстур. По отзывам пользователей с тех пор было бы удобно знать, какие внешние ключи нарушаются.

Все подробности читайте здесь.

Добавлен ActiveSupport::MessagePack

Для повышения производительности и уменьшения размера сообщения в rails был добавлен сериализатор ActiveSupport::MessagePack.

Все подробности читайте здесь.

Добавлена ​​поддержка USING INDEX для уникальных ограничений в PostgreSQL.

Добавлен параметр :using_index для использования существующего индекса при определении ограничения уникальности. При использовании параметра :using_index указанный уникальный индекс заменяется уникальным ограничением.

add_unique_key :users, deferrable: :immediate, using_index: 'unique_index_name'

Все подробности читайте здесь.

Разрешено адаптерам очередей предоставлять собственное имя

Это дает адаптерам очередей больше свободы для именования и организации своего кода.

Например, если FancyQueue хочет, чтобы их адаптер находился в FancyQueue::ActiveJobAdapter, предполагаемое имя будет active_job до этого изменения. После этого изменения они могут реализовать queue_adapter_name для возврата fancy_queue.

Все подробности читайте здесь.

Добавлена ​​поддержка Common Table Expression (CTE) для объединений.

Теперь соединения могут без проблем работать с CTE. left_outer_joins также поддерживается.

relation = Post
  .with(commented_posts: Comment.select(:post_id).distinct)
  #=> INNER JOIN commented_posts on posts.id = commented_posts.post_id
  .joins(:commented_posts)

Все подробности читайте здесь.

Добавлены пересечения? отношения

Ruby 3.1 добавил пересечения? что эквивалентно (a & b).any?. Rubocop добавил соответствующий коп, Style/ArrayIntersect, который преобразует старый стиль для использования пересечений?. К сожалению, как пересекается? не делегирован в CollectionProxy, это приводит к ложным срабатываниям, которые необходимо отключать без уважительной причины, кроме того факта, что метод не делегирован.

Этот пиар добавляет делегирование пересечений? к отношению, которое исправляет это.

Все подробности читайте здесь.

Устаревший deferrable: true опция add_foreign_key

Потому что deferrable: true и deferrable: :deferred трудно понять.

deferrable: true устарел в пользу deferrable: :immediate и будет удален в Rails 7.2.

Все подробности читайте здесь.

Много улучшений в документации

В документацию было внесено множество улучшений для улучшения SEO.

Руководство по PostgreSQL также получило новые разделы INCLUDE, UNIQUE и EXCLUDE.

Все подробности читайте здесь.

Вложенные хэш-связанные = исправления ошибок в Edge Rails

Сглаживайте только первый уровень вложенного хеша, чтобы сохранить вложенную структуру.

Все подробности читайте здесь.

Исправлено предупреждение об устаревании pg 1.5.0.

Это предупреждение появляется при использовании недавно выпущенной версии pg gem 1.5.0. PR был перенесен, так что следующий релиз должен успокоить ситуацию!

Все подробности читайте здесь.

На пустом ActiveSupport::Cache он будет постоянно вызывать ArgumentError

Этот запрос на вытягивание добавляет этап проверки в ActiveSupport::Cache::Store#normalize_key, чтобы убедиться, что ArgumentError постоянно вызывается, когда расширенный ключ кэша nil или "" (пусто) во всех методах, использующих #read_entry,#write_entry и#delete_entry(#read,#fetch,и т. д.).

Все подробности читайте здесь.

Файлы cookie Rails RFC6265 теперь совместимы с доменом: :all

Rails неправильно добавляла начальные точки к значениям домена cookie в заголовках Set-Cookie, когда присутствует параметр domain: :all.

Эта ведущая точка требовалась в файлах cookie на основе RFC 2965 (октябрь 2000 г.), но RFC 6265 (апрель 2011 г.) изменил это поведение, сделав ведущую точку строго неправильной. Этот PR решает проблему.

Все подробности читайте здесь.

Отложенные внешние ключи теперь можно передавать ссылкам

Исправлена ​​ошибка, из-за которой deferrable foreign_key игнорировался при передаче в t.references.

Все подробности читайте здесь.

Исправлено: Rack::Test::UploadedFile.new с StringIO вызывает исключение.

Этот запрос на извлечение изменяет ActiveStorage::Attached::Changes::CreateOne#upload (и частный #find_or_build_blob), поэтому он не вызывает #open на Rack::Test::UploadedFile, если он не отвечает на этот метод. Он использует сам объект (который можно прочитать так же, как и открытый файл).

Все подробности читайте здесь.

Разрешенные символы в качестве имен очередей в тестовых утверждениях ActiveJob

Запрос на вытягивание позволяет принимать как символы, так и строки с помощью assert_enqueued_with и assert_performed_with. С другой стороны, assert_enqueued_jobs и assert_performed_jobs уже поддерживают ввод символов и строк.

Все подробности читайте здесь.

Возникает ошибка при установке ключа конфигурации, который является именем метода

Раньше, если вы делаете:

config.load_defaults = 7.0

он молча принимается и может заставить пользователя поверить, что настройки по умолчанию установлены, но это не так.

Этот PR добавляет NoMethodError, чтобы пользователь мог исправить приведенное выше утверждение следующим образом:

config.load_defaults(7.0)

Все подробности читайте здесь.

Добавлен хук загрузки для ActiveRecord::ConnectionAdapters::Mysql2Adapter

Теперь у вас есть возможность расширить возможности адаптера MySQL с помощью хука, представленного ниже:

ActiveSupport.on_load(:active_record_mysql2adapter) do
  # add code to change some behaviour
end

Все подробности читайте здесь.

Исправлено: update_at не обновляется в обратном вызове before_update.

Этот запрос на извлечение гарантирует, что временные метки будут перезаписаны после выполнения всех обратных вызовов обновления, чтобы внесенные в них мутации (если таковые имеются) распознавались как обновления, в результате чего обновлялась временная метка updated_at.

Все подробности читайте здесь.

Исправлена ​​ошибка, из-за которой deferrable foreign_key игнорировался при передаче в t.references.

Обновление Rails 7.0 разрешило отложенные ограничения внешнего ключа с помощью метода add_foreign_key. Этот запрос на вытягивание распространяет эту поддержку и на t.references.

Все подробности читайте здесь.

Использование Rack::Test::UploadedFile.new с StringIO вызывает исключение

Этот запрос на извлечение изменяет ActiveStorage::Attached::Changes::CreateOne#upload (и частный #find_or_build_blob), поэтому он не вызывает #open в Rack::Test: :UploadedFile, если он не отвечает на этот метод. Он использует сам объект (который можно прочитать так же, как и открытый файл).

Все подробности читайте здесь.

Обработан пустой список ключей кеша

Эта модификация приводит к преждевременному завершению операций read_multi, write_multi, delete_multi и fetch_multi, если они вызываются с пустым списком.

Все подробности читайте здесь.

Обновлены примеры миграции, чтобы продемонстрировать независимое от базы данных выполнение необработанного SQL.

Этот запрос на вытягивание изменяет примеры кода active_record_migrations.md в разделах 3.10, 3.11 и 3.12.

В предыдущем примере в SQLite возникнет ошибка из-за того, что SQLite не поддерживает добавление ограничений в команду ALTER TABLE.

Все подробности читайте здесь.

Использовать настроенный тип pk при переносе почтового ящика действий

Этот PR добавляет migrations_test.rb для почтового ящика действий, который точно отражает тот же файл в ActiveStorage. Затем он добавляет закрытый метод primary_key_type в миграцию почтового ящика действий, который извлекает настроенный тип первичного ключа проекта. Этот метод также очень похож на Active Storage.

Все подробности читайте здесь.

Разрешено передавать nil в метод rewhere

Это изменение позволяет передавать nil в качестве параметра метода rewhere в ActiveRecord вместо того, чтобы вызывать ошибку.

Все подробности читайте здесь.

Поддержка :message_pack в качестве формата сериализатора кеша.

Эта фиксация добавляет поддержку :message_pack в качестве опции для config.active_support.cache_format_version.

Все подробности читайте здесь.

Улучшить производительность кеша для пустых строковых значений

Как новый формат кэша 7.1, так и ранее упомянутый формат кэша :message_pack получили улучшения производительности для простых строковых значений, таких как фрагменты представления.

Все подробности читайте здесь.

Добавлена ​​поддержка сопоставления для assert_enqueued_email_with

Ранее метод assert_enqueued_with разрешал использование процедур для сопоставления аргументов, а метод assert_enqueued_email_with не позволял использовать процедуры как для аргументов, так и для параметров. Однако недавно отправленный запрос на вытягивание обновил assert_enqueued_email_with, чтобы принимать процедуры как для аргументов, так и для параметров.

Все подробности читайте здесь.

Добавлен помощник picture_tag

Этот PR добавляет поддержку тега изображения HTML. Он поддерживает передачу одного элемента (строка), нескольких (массив) или блока, если вам нужен полный контроль над тем, что он генерирует. Все свойства, переданные помощнику, будут применяться к тегу изображения. Если вам нужно передать свойства тегу img, вы можете сделать это внутри ключа :image.

Подробные примеры использования этого тега приведены в PR.

Все подробности читайте здесь.

Предотвращено дублирование фильтров для зашифрованных атрибутов

При объявлении зашифрованного атрибута Active Record фильтр для него автоматически добавляется в config.filter_parameters. До этой фиксации фильтр повторно добавлялся каждый раз при перезагрузке модели. Этот PR гарантирует, что фильтры добавляются только один раз, поэтому config.filter_parameters не увеличивается неограниченно.

Все подробности читайте здесь.

Сделать кеш запросов Active Record наименее использовавшимся (LRU)

Кэш запросов Active Record был обновлен, чтобы удалить наименее использовавшиеся записи, по умолчанию 100 записей. Размер кеша можно изменить, изменив конфигурацию в файле database.yml.

Все подробности читайте здесь.

Предотвратить зависание неанонимных модулей

Module#deep_dup был изменен, чтобы возвращать сам модуль (а не копию), когда модуль не является анонимным. Однако это приводит к тому, что неанонимные модули замораживаются через value.deep_dup.freeze при передаче в ActiveModel::Type::Helpers::Mutable#immutable_value. Так, например, атрибуты класса больше не могут быть установлены в модуле.

Чтобы предотвратить такие проблемы, эта фиксация снимает блокировку с immutable_value. immutable_value вызывается только ActiveRecord::PredicateBuilder#build_bind_attribute, который заботится только о том, чтобы другой код не мог изменять значение, а не о том, что значение фактически заморожено.

Все подробности читайте здесь.

Счетчики теперь принимают аргумент количества

Упомянутый запрос на вытягивание предлагает добавить опцию «by» к методам increment_counter и decrement_counter. Это упростило бы процесс изменения счетчиков, позволяя использовать произвольное значение. Приведен пример использования новой опции.

Company.increment_counter(:likes_count, 5, by: 3)

Все подробности читайте здесь.

Разрешено PredicateBuilder распознавать имена таблиц в пространстве имен схемы.

В предыдущей реализации ActiveRecord::PredicateBuilder предполагалось, что имена столбцов будут указываться с использованием одной точки в точечной нотации. Если для таблицы было задано пространство имен в схеме, а столбец был указан в точечной нотации, имя схемы рассматривалось как имя таблицы. С помощью этого запроса на вытягивание теперь можно указать столбцы в формате schema.table.column в дополнение к table.column.

Все подробности читайте здесь.

Сериализатор сообщений по умолчанию: json_allow_marshal

Эта фиксация изменяет сериализатор сообщений по умолчанию, заданный config.load_defaults 7.1, с :json на :json_allow_marshal, чтобы обновленные приложения могли продолжать читать старые сообщения без дополнительной настройки.

Все подробности читайте здесь.

Дези Разработчик

Что касается Desi Developer, вы, возможно, заметили, что я начал короткий рисованный мультсериал с нашим собственным Рубиновым Человеком в качестве супергероя.

Цель этой короткой серии — привлечь будущих или действующих младших программистов и познакомить их с Ruby в интересной форме.

Если вы хотите принять участие в этом путешествии, пожалуйста, поделитесь этими шортами в своем кругу. У меня уходит столько времени и сил, чтобы придумать сюжетную линию, нарисовать все анимации вручную, а потом сделать озвучку. Одно можно сказать наверняка, RubyMan с этого момента станет только сильнее…



Смотри сейчас на Youtube

Помимо #rubyman, я пытался распаковать технический гаджет, который я заказал, чтобы повысить свою производительность во время написания кода. Вот видео распаковки, полный обзор будет через неделю или две, так что следите за обновлениями.

Смотри на ютубе

Если вы зашли так далеко и считаете, что этот #новостной бюллетень или любой другой мой контент представляет для вас какую-либо ценность, рассмотрите возможность подписки на платную версию этого информационного бюллетеня на substack. Небольшое количество платных подписчиков может помочь мне сохранить весь мой контент бесплатным для всех остальных.

«Все еще жду, чтобы отпраздновать мою первую платную подписку на этот информационный бюллетень. Хочешь быть первым? Кликните сюда."

И это все, что касается выпуска этого месяца, я вернусь в следующем месяце с новыми рубиновыми обновлениями.

До новых встреч ✌️