💡 Инструкция: Выберите один ответ из пяти. Время — 70 минут. У каждого задания ровно один правильный вариант. Фрагменты рассчитаны на Ruby 4.0.6; задания Rails — на Rails 8.1.3. После завершения откроются общий процент, 5 тематических результатов и разбор всех ответов.
Вопрос 1 из 25
Что покажет выполнение этого фрагмента из раздела «Ассоциации»? Проверьте обе половины ответа: частично верный вариант остаётся неверным.
Ruby Ruby — Ассоциации Копировать
# Проследите выполнение и выберите точный результат.
class Author < ApplicationRecord
has_many :books, dependent: :destroy
end
class Book < ApplicationRecord
belongs_to :author
end
# В миграции: add_foreign_key :books, :authors
`dependent: :destroy` вызывает удаление дочерних записей через Rails, тогда как внешняя ссылка базы остаётся отдельной гарантией. Это объясняется тем, что методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру. Это объясняется тем, что ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
`dependent: :destroy` вызывает удаление дочерних записей через Rails, тогда как внешняя ссылка базы остаётся отдельной гарантией. Это объясняется тем, что callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки. Это объясняется тем, что ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
`dependent: :destroy` вызывает удаление дочерних записей через Rails, тогда как внешняя ссылка базы остаётся отдельной гарантией. Это объясняется тем, что ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
Вопрос 2 из 25
Какой вывод учитывает и возвращаемое значение, и побочный эффект в теме «Валидации»? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Ruby Ruby — Валидации Копировать
# Проследите выполнение и выберите точный результат.
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
end
# В миграции также нужен:
# add_index :users, :email, unique: true
Две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки. Причина такого результата: callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки. Причина такого результата: методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки. Причина такого результата: валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру. Причина такого результата: валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку. Причина такого результата: валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Вопрос 4 из 25
Не запуская пример, выберите точный итог для блока «N+1-запросы». Не выбирайте ответ по одному точному фрагменту: вся формулировка должна выдерживать проверку.
Ruby Ruby — N+1-запросы Копировать
# Проследите выполнение и выберите точный результат.
books = Book.includes(:author).limit(100)
books.each do |book|
puts "#{book.title}: #{book.author.name}"
end
Предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку. Механизм результата таков: n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру. Механизм результата таков: n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку. Механизм результата таков: ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
`after_commit` вызывается только после успешной фиксации транзакции, в отличие от `after_save`. Механизм результата таков: n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку. Механизм результата таков: callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Вопрос 5 из 25
Как следует прочитать результат показанного примера «Безопасность данных»? Правильным считается только полностью согласованное утверждение.
Ruby Ruby — Безопасность данных Копировать
# Проследите выполнение и выберите точный результат.
status = params[:status]
orders = Order.where('status = ?', status)
p orders.to_sql
Предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку. Наблюдение согласуется с тем, что методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
`after_commit` вызывается только после успешной фиксации транзакции, в отличие от `after_save`. Наблюдение согласуется с тем, что методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру. Наблюдение согласуется с тем, что методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру. Наблюдение согласуется с тем, что callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру. Наблюдение согласуется с тем, что валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Вопрос 6 из 25
Базовый пример выглядит корректно. Что всё же нарушает контракт в блоке «Ассоциации»? Оценивайте ответ целиком: обе части утверждения должны быть точными.
Ruby Ruby — Ассоциации Копировать
# Обычный запуск проходит. Найдите скрытый риск.
class Author < ApplicationRecord
has_many :books, dependent: :destroy
end
class Book < ApplicationRecord
belongs_to :author
end
# В миграции: add_foreign_key :books, :authors
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. Причина — ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
Отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись. Причина — ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
Полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления. Причина — n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления. Причина — ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
Полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления. Причина — callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Вопрос 7 из 25
Какое допущение делает этот код по теме «Валидации» ненадёжным? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Ruby Ruby — Валидации Копировать
# Обычный запуск проходит. Найдите скрытый риск.
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
end
# В миграции также нужен:
# add_index :users, :email, unique: true
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. Этот риск связан с тем, что валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить. Этот риск связан с тем, что методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить. Этот риск связан с тем, что callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить. Этот риск связан с тем, что валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы. Этот риск связан с тем, что валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Вопрос 8 из 25
Какой отказ связан с причиной в коде, а не с внешним шумом, в теме «Обратные вызовы (callbacks)»? Нужен вариант без логического разрыва между первой и второй частью.
Ruby Ruby — Обратные вызовы (callbacks) Копировать
# Обычный запуск проходит. Найдите скрытый риск.
class Order < ApplicationRecord
after_commit :enqueue_receipt, on: :create
private
def enqueue_receipt
ReceiptJob.perform_later(id)
end
end
Отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись. Уязвимое место возникает потому, что методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись. Уязвимое место возникает потому, что ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
Отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись. Уязвимое место возникает потому, что callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления. Уязвимое место возникает потому, что callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. Уязвимое место возникает потому, что callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Вопрос 9 из 25
Какое допущение делает этот код по теме «N+1-запросы» ненадёжным? Смотрите на всю причинную связку, а не только на знакомую формулировку.
Ruby Ruby — N+1-запросы Копировать
# Обычный запуск проходит. Найдите скрытый риск.
books = Book.includes(:author).limit(100)
books.each do |book|
puts "#{book.title}: #{book.author.name}"
end
Отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить. К такому сбою приводит правило: n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы. К такому сбою приводит правило: n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы. К такому сбою приводит правило: ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность.
Без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы. К такому сбою приводит правило: callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. К такому сбою приводит правило: n+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы.
Вопрос 10 из 25
Где в показанном решении «Безопасность данных» скрыт дефект, который проявится не на каждом входе? Не выбирайте ответ по одному точному фрагменту: вся формулировка должна выдерживать проверку.
Ruby Ruby — Безопасность данных Копировать
# Обычный запуск проходит. Найдите скрытый риск.
status = params[:status]
orders = Order.where('status = ?', status)
p orders.to_sql
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. Источник риска: callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit.
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. Источник риска: методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join. Источник риска: валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы.
Отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись. Источник риска: методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления. Источник риска: методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL.
Вопрос 11 из 25
На какой контракт языка или библиотеки опирается результат блока «Ассоциации»? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit. Поэтому `dependent: :destroy` вызывает удаление дочерних записей через Rails, тогда как внешняя ссылка базы остаётся отдельной гарантией.
Ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность. Поэтому условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру.
Ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность. Поэтому две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки.
N+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы. Поэтому `dependent: :destroy` вызывает удаление дочерних записей через Rails, тогда как внешняя ссылка базы остаётся отдельной гарантией.
Ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность. Поэтому `dependent: :destroy` вызывает удаление дочерних записей через Rails, тогда как внешняя ссылка базы остаётся отдельной гарантией.
Вопрос 12 из 25
Какой принцип темы «Валидации» переносится на другие примеры того же типа? Выберите связку, в которой верны и основной вывод, и его обоснование.
Методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL. Из этого следует, что две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки.
Валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы. Из этого следует, что предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку.
Валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы. Из этого следует, что две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки.
Callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit. Из этого следует, что две записи могут обе пройти `validates :email, uniqueness: true`, если проверяются одновременно до вставки.
Валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы. Из этого следует, что условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру.
Вопрос 14 из 25
Какой принцип темы «N+1-запросы» переносится на другие примеры того же типа? В правильном ответе вторая часть действительно объясняет или проверяет первую.
N+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы. Именно поэтому условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру.
Callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit. Именно поэтому предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку.
Ассоциация описывает навигацию и параметры владения, но внешняя ссылка и её ограничения в базе обеспечивают фактическую ссылочную целостность. Именно поэтому предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку.
N+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы. Именно поэтому `after_commit` вызывается только после успешной фиксации транзакции, в отличие от `after_save`.
N+1 возникает, когда список загружается одним запросом, а ассоциация каждого элемента — отдельным; `includes`, `preload` и `eager_load` имеют разные планы. Именно поэтому предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку.
Вопрос 15 из 25
Какое правило остаётся верным, даже если вход и порядок вызовов изменятся, в теме «Безопасность данных»? Смотрите на всю причинную связку, а не только на знакомую формулировку.
Валидации модели улучшают сообщение пользователю, но конкурентную уникальность гарантирует только уникальный индекс базы. Это правило даёт такой результат: условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру.
Методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL. Это правило даёт такой результат: условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру.
Методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL. Это правило даёт такой результат: `after_commit` вызывается только после успешной фиксации транзакции, в отличие от `after_save`.
Callbacks запускаются в жизненном цикле модели и могут откатить сохранение; внешние необратимые действия безопаснее выполнять после commit. Это правило даёт такой результат: условие с placeholder передаёт статус как данные, а Active Record экранирует его согласно адаптеру.
Методы `find_by_sql`, `where` и другие запросы должны использовать параметры; интерполяция внешних значений меняет структуру SQL. Это правило даёт такой результат: предзагрузка `includes(:author)` позволяет обращаться к авторам книг без запроса на каждую строку.
Вопрос 16 из 25
Какой вариант правки выдержит граничный сценарий темы «Ассоциации»? Верный вариант не содержит частично правильной подмены причины или следствия.
Ruby Ruby — Ассоциации Копировать
# Выберите изменение, которое исправляет причину.
class Author < ApplicationRecord
has_many :books, dependent: :destroy
end
class Book < ApplicationRecord
belongs_to :author
end
# В миграции: add_foreign_key :books, :authors
Согласовать `dependent` с внешним ключом и его ON DELETE-политикой, затем проверить удаление через приложение и напрямую в базе. Так закрывается риск: безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join.
Считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности. Так закрывается риск: полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления.
Согласовать `dependent` с внешним ключом и его ON DELETE-политикой, затем проверить удаление через приложение и напрямую в базе. Так закрывается риск: отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись.
Согласовать `dependent` с внешним ключом и его ON DELETE-политикой, затем проверить удаление через приложение и напрямую в базе. Так закрывается риск: полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления.
Оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем. Так закрывается риск: полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления.
Вопрос 17 из 25
Какой рефакторинг делает контракт блока «Валидации» явным и проверяемым? Правильным считается только полностью согласованное утверждение.
Ruby Ruby — Валидации Копировать
# Выберите изменение, которое исправляет причину.
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
end
# В миграции также нужен:
# add_index :users, :email, unique: true
Добавить ограничение базы и обработать нарушение уникальности как ожидаемый конкурентный исход. Это изменение устраняет проблему: отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись.
Считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности. Это изменение устраняет проблему: отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить.
Использовать Hash/Arel/параметры для значений и белые списки для имён столбцов и направлений сортировки. Это изменение устраняет проблему: отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить.
Добавить ограничение базы и обработать нарушение уникальности как ожидаемый конкурентный исход. Это изменение устраняет проблему: отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить.
Добавить ограничение базы и обработать нарушение уникальности как ожидаемый конкурентный исход. Это изменение устраняет проблему: без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы.
Вопрос 18 из 25
Какое действие добавляет недостающую гарантию в блоке «Обратные вызовы (callbacks)»? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Ruby Ruby — Обратные вызовы (callbacks) Копировать
# Выберите изменение, которое исправляет причину.
class Order < ApplicationRecord
after_commit :enqueue_receipt, on: :create
private
def enqueue_receipt
ReceiptJob.perform_later(id)
end
end
Оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем. Такая правка нужна из-за риска: безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join.
Считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности. Такая правка нужна из-за риска: отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись.
Оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем. Такая правка нужна из-за риска: полагаться только на dependent означает, что прямой SQL или другой сервис может создать сироту или нарушить порядок удаления.
Согласовать `dependent` с внешним ключом и его ON DELETE-политикой, затем проверить удаление через приложение и напрямую в базе. Такая правка нужна из-за риска: отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись.
Оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем. Такая правка нужна из-за риска: отправка сообщения в `after_save` может произойти, а затем транзакция откатится — внешний мир увидит несуществующую запись.
Вопрос 19 из 25
Какой вариант решения «N+1-запросы» останется понятным при сопровождении? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Ruby Ruby — N+1-запросы Копировать
# Выберите изменение, которое исправляет причину.
books = Book.includes(:author).limit(100)
books.each do |book|
puts "#{book.title}: #{book.author.name}"
end
Оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем. Решение адресует следующий дефект: без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы.
Считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности. Решение адресует следующий дефект: отсутствие уникального индекса превращает редкую гонку в постоянные дубликаты, которые затем сложно объединить.
Считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности. Решение адресует следующий дефект: без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы.
Считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности. Решение адресует следующий дефект: безопасное значение в одном месте может стать небезопасным после повторной интерполяции фрагмента в order, select или join.
Согласовать `dependent` с внешним ключом и его ON DELETE-политикой, затем проверить удаление через приложение и напрямую в базе. Решение адресует следующий дефект: без измерения можно заменить N+1 огромным JOIN, размножить строки и увеличить память сильнее исходной проблемы.
Вопрос 23 из 25
Какую границу контракта «Обратные вызовы (callbacks)» нужно закрепить отдельным тестом? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Проверить вложенную транзакцию: after_commit срабатывает на фактической фиксации, а не при каждом `save!`. Проверка относится к изменению: оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем.
Проверить пустой массив в `where(id: ids)` и nil: полученный SQL может иметь отличный от ожидаемого смысл. Проверка относится к изменению: оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем.
Проверить большие коллекции: `:destroy` загружает записи и запускает callbacks, что может быть слишком дорого. Проверка относится к изменению: оставлять в callbacks локальные инварианты, а интеграционные эффекты переводить в after_commit/outbox с идемпотентным потребителем.
Проверить вложенную транзакцию: after_commit срабатывает на фактической фиксации, а не при каждом `save!`. Проверка относится к изменению: считать запросы и объём результата на реальном сценарии; выбирать preload или join по нужной фильтрации и кардинальности.
Проверить вложенную транзакцию: after_commit срабатывает на фактической фиксации, а не при каждом `save!`. Проверка относится к изменению: согласовать `dependent` с внешним ключом и его ON DELETE-политикой, затем проверить удаление через приложение и напрямую в базе.