Вы находитесь на странице: 1из 22

ООП

Три кита объектно-ориентированного программирования:


Инкапсуляция, Наследование, Полиморфизм

Инкапсуляция — это принцип сокрытия информации, путем


управления областью видимости атрибутов и методов класса Доступ к
этим свойствам и методам доступен только через специально
определяемые интерфейсы. Эти интерфейсы называются геттеры и
сеттеры. Геттеры получают значение, а сеттеры устанавливают эти
значения

attr_reader : height, :weight # Для getter


attr_writer : height, :weight # Для setter
attr_accessor : height, :weight # Для getter и setter

Наследование заключается в передачи всей структуры одного класса в другой, или просто
копирование одного класс в другойНо наследование также позволяет создавать
дополнительные свойства, не доступные классу, от которого произошло наследование.
Наследование — очень полезная вещь, потому что предоставляет возможность повторного
использования кода и спасает от повторений в коде.

Полиморфизм — это свойство объектов с одинаковой спецификацией


иметь различную реализацию
есть тип транспорта - автомобиль и марки автомобилей - полиморфные
объекты. Так, например, само по себе понятие "автомобиль"
абстрактно, а вот если уже говорить о конкретной марке, то
абстрактность исчезает. Это будет хорошо заметно, если взять
"Запорожец" и "Роллс-Ройс". Эти объекты сильно отличаются друг от
друга, но тем не менее оба они являются наследниками абстрактного
понятия "автомобиль". Кардинальные отличия двум этим маркам
придал именно полиморфизм.
Типы связей в Rails

В Rails связи используются для соединения между двумя моделями


Active Record

В Rails есть 6 типов связей

1. belonge_to

Связь один к одному. Это когда одному автору может принадлежать


одна книга. При его создании должно использоваться единственное
число

2. has_one

Связь устанавливает соединение один к одному, но это связь


показывает, что каждый экземпляр модели содержит в себе один
экземпляр другой модели.
Пример:
Каждый поставщик может иметь только один аккаунт.

3. has_many

Связь один ко многим. Связь показывает, что каждый экземпляр


модели имеет 0 или более экземпляров другой модели.

4. .Has_many:through

Связь многие ко многим с третей моделью. Эта связь указывает, что


модель может соответствовать нулю или более экземплярам другой
модели через третью модель.
Пример:
Рассмотрим поликлинику, где пациентам дают направления к врачам

5. Has_one:through

Связь один к одному с третьей моделью. Модель может быть связана с


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

6. Has_and_belong_to_many

Прямое соеденение многие ко многим с другой моделью без


промежуточной связи
Настройка связи один к одному между двумя моделями

Различие в том, где помещен внешний ключ (он должен быть в таблице
для класса, объявляющего связь belongs_to), но вы также должны
думать о реальном значении данных. Отношение has_one говорит, то
что-то указывает на вас. Например, больше смысла в том, что
поставщик владеет аккаунтом, чем в том, что аккаунт владеет
поставщиком

Утиная Типизация

Утиная типизация —предполагает, что объект будет реагировать на определённый набор


методов. Преимущество утиной типизации в её гибкости. Она не требует наследования или
объявлений реализации

Настройка связи многи к многим между двумя моделями

Есть два способа Напрямую через


1. . Has_and_belong_to_many

Не будет создана прямая связь без соединяющего их модуля


1. 1.Has_many:through

Будет создана связь для соединения модуля


MVC
• Model — Модель — Бизнес модель или объект предметной
области
• View — Представление — Элементы пользовательского
интерфейса
• Controller — Контроллер — Отслеживание событий
пользовательского интерфейса
В Rails в качестве реализации Model выступает класс ORM
ActiveRecord. Благодаря динамической природе Ruby ActiveRecord
позволяет работать с таблицами базы данных без какой-либо
предварительной конфигурации, так как схема полей таблицы
получается “на лету.”
За View отвечает пакет ActionView, в который входит поддержка
генерации HTML и XML из различных типов шаблонов. ActionView
предоставляет удобные средства вложения шаблонов и выделения
общей разметки в отдельные файлы для избегания повторов.
Controller реализуется пакетом ActionController, который отвечает за
обработку запроса, инициализацию модели и вызов методов на ней, а
также за передачу данных в HTML шаблоны.

ORM

ORM или Object Relational Mapper

Это значит, что Active Record принимает данные, которые хранятся в


таблицах БД с помощью строк и столбцов, которые должны быть
интерпретированный на Языки БД и это позволяет взаимодействовать с
этими данными, как если бы это был обычный объект Ruby.

Поэтому нам не нужно вручную вызывать ДБ.


ORM обрабатывает ее за вас. RoR использует один из них под
названием ActiveRecord

Active Record сглаживает все различия между этими БД, так что вам не
нужно думать об этом. Вы сосредотачиваетесь на написании кода для
вашего приложения, а Active Record будет думать о мельчайших
деталях подключения вас к вашей базе данных. Даже если вы
поменяете БД на другую вам фактически не нужно изменять какой-
либо основной код приложения, а только некоторые конфигурационные
файлы.

К ORM мы также можем добавить sequel.


Git
Разница между Git pull vs Git merge

При использовании Git pull он будет сливать любые внесённые commit


в ветку, в которой вы сейчас работаете. Команда Git Pull Request
автоматически сливает commit, не давая вам сначала просмотреть их.
Может приводит к частым конфликтам.

Git Pull Request - предложение изменения кода в чужом репозитории

Git merge

Git merge принимает содержимое ветки, где мы писали код и


объединяет их с master веткой. В этом процессе изменяется только
master ветка. История исходных веток остается неизменной.
Git merge x_branch - применит изменения из ветки x_branch к текущей
ветке, если не возникнет конфликтов

Git Rebase

Git rebase — еще один способ перенести изменения из одной ветки в


другую. Rebase сжимает все изменения в один «патч». Затем он вносить
все изменения в master ветку.
Что такое Git cherry-pick?

Git cherry-pick - забирает commit из одной ветки в другую, это бывает


полезно когда изменения сделанные другим разработчиком в его ветке,
прямо сейчас нужны тебе в твоей ветке, и что бы не писать этот код
заново, ты забираешь его commit себе в ветку

Для чего нужен Git amend?

Эта команда откроет сообщение вашего последнего commit для того,


чтобы вы могли его исправить. Будет изменен последний commit и в
него будут добавлены файлы

Для чего нужно использовать Git stash?

Эта операция берет изменённое состояние вашей рабочей директории,


то есть изменённые файлы и изменения, и сохраняет их в хранилище
незавершённых изменений, которые вы можете в любое время
применить обратно.
SQL
Связи

Связь many-to-many

Связь многие ко многим подразумевает, что записи в одной таблице


может иметь множество ссылок на другую таблицу и наоборот. Для
такой связи нужно создавать дополнительную таблицу, которая сведет
связь many-to-many до связи one-to-many

Для примера предположим, обувь может быть нескольких типов


(кроссовки-кеды или туфли-мокасины). Может пример и не самый
удачный, однако для тренировочных целей будет то, что нужно.

Связь one-to-one

Данный тип связей встречает не часто. В этом случае объекту одной


сущности можно сопоставить только один объект другой сущности.
Например, на некоторых сайтах пользователь может иметь только один
блог. То есть возникает отношение один пользователь - один блог.

Связь one-to-many

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


one-to-many то это означает: что одной записи в таблице может
отвечать множество записей другой таблицы. Например, у одного
поставщика может быть много обуви.

JOINS в SQL

(INNER) JOIN: возвращает записи, имеющие совпадающие значения в


обеих таблицах
Left (OUTER) JOIN: возвращает все записи из левой таблицы и
совпадающие записи из правой таблицы
RIGHT (OUTER) JOIN: возвращает все записи из правой таблицы и
совпадающие записи из левой таблицы
FULL (OUTER) JOIN: возвращает все записи, когда есть совпадение в
левой или правой таблице

Проблема N+1

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


используем ассоциацию (one-to-many). ORM, по умолчанию, делает
запрос на выборку одной записи для родительского обьекта и запрос
для КАЖДОЙ дочерней записи. Если коротко, то делая N+1 запрос вы в
разы сильнее нагружаете базу данных, там, где этого можно избежать.

Решение:

Eager Loading — это механизм, позволяющий загружать ассоциации


объекта, используя минимальное количество запросов. В ActiveRecord
есть метод includes, который мы и будем использовать, чтобы загрузить
данные ассоциации.

Также есть гем Bullet который помогает в этом

Scope
http://rusrails.ru/active-record-query-interface (15 заметка)

CRUD
https://guides.firstdraft.com/crud-with-ruby#crud-with-ruby
https://www.rubycode.ru/ruby-on-rails/71-ruby-on-rails-dlya-
nachinayuschih.html
SOLID
SOLID это свод пяти основных принципов OOP.

Принципы
1. Single Responsibility Principle (Принцип единственной
ответственности)
2. Open Closed Principle (Принцип открытости/закрытости)
3. Liskov Substitution Principle (Принцип подстановки Барбары
Лисков)
4. Interface Segregation Principle (Принцип разделения интерфейса)
5. Dependency Inversion Principle (Принцип инверсии зависимостей)

Первый принцип SRP

Как он устроен?

Говоря проще принцип SRP, состоит в том, что каждый класс должен


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

В чем может быть проблема этого принципа?

Чрезмерная любовь к SRP ведет к обилию мелких классов/методов и


усложняет логику между ними.

Второй принцип OCP


Как он устроен?

Каждый класс должен быть закрыт для изменения и открыт для


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

В чем может быть проблема этого принципа?

Чрезмерная любовь к OCP ведет к сложным решениям с чрезмерным


числом абстракции.

Третий принцип LSP

Как он устроен?

Если у класса A есть голос то у класса B тоже он должен быть

Поведение наследуемых классов должно быть ожидаемо для кода,


использующие переменные базового класса Или, иначе говоря, для
класса S является подтипом T, то подтип T можно спокойно заменить
подтипом S без каких-то фатальных изменений.

В чем может быть проблема этого принципа?

Данный анти-принцип проявляется либо в чрезмерном количестве


наследования, либо в его полном отсутствии, в зависимости от опыта и
взглядов местного главного архитектора.
Четвертый принцип ISP

Как он устроен?

Классы должны быть ограниченны более узким интерфейсом.


Соблюдение этого принципа препятствует разрастанию интерфейсов,
размытию их логики и сокращению используемого кода.

В чем может быть проблема этого принципа?

Интерфейсы классов разбиваются на слишком большое число


составляющих, что делает их неудобными для использования всеми
клиентам

Пятый принцип DIP


Как он устроен?

Зависимости должны строятся вокруг интерфейсов, а не деталей.


Считается что это принцип возник из-за OCP и LSP. Код, написанный
по двум вышеперечисленным принципам, должен быть читаемым и
содержать четко разделенные абстракции. Он также должен быть
расширяемым, а дочерние классы легко заменяемыми другими
экземплярами базового класса.

В чем может быть проблема этого принципа?


Интерфейсы выделяются для каждого класса и пачками передаются
через конструкторы. Понять, где находится логика становится
практически невозможно.
HTTP методы для CRUD

Create = PUT with a new URI


POST to a base URI returning a newly created URI
Read = GET
Update = PUT with an existing URI
Delete = DELETE

POST Creates a new resource. (Создает новый источники)


GET Retrieves a resource. (Возвращает ресурсы)
PUT Updates an existing resource. (Обновляет ресурсы)
DELETE Deletes a resource. (Удаляет их )

https://www.restapitutorial.com/lessons/httpmethods.html

GET /photos photos#index display a list of all photos


GET /photos/new photos#new return an HTML form for creating a
new photo
POST /photos photos#createcreate a new photo
GET /photos/:id photos#show display a specific photo
GET /photos/:id/edit photos#edit return an HTML form for
editing a photo
PATCH/PUT /photos/:id photos#update update a specific photo
DELETE /photos/:id photos#destroy delete a specific photo

REST в Rails

https://medium.com/@andr.ivas12/rest-простым-языком-90a0bca0bc78
Ruby
Итераторы

Итераторы в ruby используются вместо циклов тк более компактны и


функциональность больше.

Также, итератор — это метод, который некоторое кол-во раз вызывает


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

Находятся в модуле Enum. Используются для работы hash и array.

Как работают?

Метод, который обходит коллекцию поэлементно и выполняет с каждым


элементом определенную операцию.

Обозначается {}, есть несколько строк кода используют конструкцию do


end.

Несколько методов которые есть у Итераторов

Для Num

Times – выполняет блок кода N число раз


Upto – Аналог for
Step – похож на upto, но можно задавать шаг хода

Для Диапазона

Each – позволяет проходить по каждому элементу входящему в


диапазон

Для Hash && Array

Each(array) – пробегает по коллекции и передает каждый ее элемент в


блок, где с ним происходит какое то условие

Each(hash) – можно применить не только к значениям, но и к индексам

Collect && Map – используются для создания новой коллекции


Count – считаю кол во элементов которые подходят по задачу

Struct vs OpenStruct

В OpenStruct как и в JS динамически приклеиваются поля и методы.

Блоки

Блок – произвольный код которые можно передать любому методу


(используется конструкция do end или {когда код в одну строку})

У {} более высокий приоритет в выполнении операций

Ключевое слово yield

Используется для передачи управлением блоку. После его завершения


передает обратно работу методу

Если мы используем yield то он будет требовать от нас блок, но можно


использовать block_given? Для проверки действительно ли нам нужен
блок.

Как передать инфо в блок?

Явно передать блоку ту информацию, в которой он может нуждаться

Сходство метода и блока

Метод может принимать аргументы, если они были указаны в его


определении. В блок через yield тоже можно передавать аргументы и
вызывать с ними. И было бы логичным ожидать, что в самом блоке
нужно как-то указать перечень принимаемых аргументов. Единственное
различие это как передать аргументы (для метода (), а для блока | |).

Еще одно сходство, что переменная, объявленная внутри них,


недоступна в других участках выполнимого кода

Почему блок — это не анонимный метод?

Основное и принципиальное отличие блока от метода в том, что блок


имеет доступ к переменным, объявленным до него во внешнем
окружении.
Даже если внутри блока происходит присвоение переменной, ранее
объявленной не в нем, Ruby не создает локальную переменную, а
позволяет присвоить внешней переменной новое значение.

Но надо понимать, что блок не может видеть все переменные кода, т е


он видит не скрытые от него внутри методов или блока переменные и те
переменные, которые были объявлены на момент выполнения блока.

Send

Он отправляет сообщение экземпляру объекта и его предкам в иерархии


классов до тех пор, пока какой-либо метод не отреагирует (поскольку
его имя совпадает с первым аргументом).

Почему не надо использовать send?


Тк они нарушаю правило инкапсуляции не соответствие ООП

Типы данных в Ruby

1. Integer (Целые числа)


2. Float (Числа с плавающей точкой)
3. String (Строка)
4. Hash (Хэши)
5. Boolean (True или False)
6. .Array (Массивы)

Eigenclass в Ruby

Eigenclass это специальный неявный класс, который индивидуален для


каждого объекта в Ruby

Для чего он нужен?

Благодоря этому можно иметь объекты одного и того же класса, но с


разным набором методов
Синглтон-методы - что такое?

Это методы, которые буду доступны только определенному объекту, а не


всем экземплярам того же класса

Где хранятся методы класса в Ruby?

В его собственном синглтон-классе

Singleton class

Singleton class это класс, созданный только для определенного объекта.


Этот класс как-то” скрыт " от нас, но он есть. При вызове метода для
этого объекта в Ruby, он сначала посмотрит в свой одноэлементный
класс, если таковой существует, чтобы найти этот метод.

https://refactoring.guru/ru/design-patterns/singleton/ruby/example

Proc и lambda отличия

Прок и лямбда являются элементами класса Proc

1. 1.Lambda проверяют количество аргументов, Proc — нет.


2. Proc прерывают выполнение функции при вызове return,
Lambda — нет.

Ключевое слово Super

Super. Им обозначаются переменные, которые классы-потомки должны


передать вышестоящему классу. Просто super передаст все
переменные, super() — ни одной.
Когда вызываетеся super без аргументов, Ruby отправляет сообщение
родителю текущего объекта с просьбой вызвать метод с тем же именем,
из которого вы вызывали super, вместе с аргументами, которые были
переданы этому методу.

С другой стороны, при вызове с помощью super () он не посылает


никаких аргументов родителю.

Если аргументы, которые уже есть, не соответствуют тому, что ожидает


родитель, то надо использовать super () или явно перечислить
параметры в функциональном вызове, чтобы соответствовать
допустимому родительскому конструктору.
Аутентификация и Авторизация

Аутентификация – прохождение проверки подлинности.

Авторизация – предоставление и проверка прав на совершение каких-


либо действий в системе

Тестирование кода в Rails

https://medium.com/@lucyhackwrench/%D1%87%D1%82%D0%BE-
%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-tdd-%D0%B8-bdd-
%D0%BD%D0%B0-%D0%BF%D0%B0%D0%BB%D1%8C
%D1%86%D0%B0%D1%85-%D0%B8-%D1%87%D1%82%D0%BE-
%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD-
%D0%B7%D0%BD%D0%B0%D1%82%D1%8C-%D0%B

Отличие модуля от класса прочитать

Public protected private

Все методы, независимо от контроля доступа, могут быть доступны


внутри класса. Public методы не обеспечивают никакого контроля
доступа - они могут быть вызваны в любой области. Protected методы
доступны только для других объектов того же класса. Private методы
доступны только в контексте текущего объекта.

Require VS Include and Extend

Include
Если написан несколько классов, которые совместно используют
похожие методы, можно извлечь эти методы в модуль. Как только
методы записаны в модуль, вы можете “включить” этот модуль в любой
из классов, которые могут потребоваться для вызова этих методов. Нет
необходимости держать эти методы в подвешенном состоянии.

Require будет загружать переданный файл только один раз, а затем


помнить, что файл был загружен.

include — добавляет методы модуля объекту.extend —


вызывает include для синглтон-класса объекта.

Или такой ответ


Оператор Ruby include просто делает ссылку на именованный модуль.
Но Если этот модуль находится в отдельном файле, то надо
использовать require для перетаскивания этого файла перед
использованием include . Во-вторых, Ruby include не просто копирует
методы экземпляра модуля в класс.

Self-Ruby

Self — это ссылка на текущий объект. Для обращений к элементам


интанс-объекта не обязательно указывать self, так как он
подразумевается по умолчанию, но иногда он нужен. Например, при
создании методов класса
 В контексте тела класса (методов класса и вне их) self является ссылкой
на сам классом. При работе с self главное помнить, что это ссылка на
текущий объект и что такой объект всегда существует, даже когда вы
работаете в корневой области видимости.
Все про классы и как с ними работать и объявлять
https://medium.com/@croatech/%D0%BC
%D0%B5%D1%82%D0%B0%D0%BF%D1%80%D0%BE
%D0%B3%D1%80%D0%B0%D0%BC%D0%BC
%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD
%D0%B8%D0%B5-%D0%B2-ruby-%D1%8D%D1%82%D0%BE-
%D0%B2%D1%81%D0%B5-%D0%BE-self-b72bb71b13b4

Колбэки Active Record

http://rusrails.ru/active-record-callbacks#after_initialize-i-after_find

Миграции в Rails

http://rusrails.ru/rails-database-migrations - using-reversible

Миграции и seeds можно делать одновременно (но это техническая


возможность) и seed надо прописывать после набора миграции

Garbage Collector

https://stackify.com/how-does-ruby-garbage-collection-work-a-simple-
tutorial/

Дизайны проектирования

Query Object

Объект запроса - это шаблон, который помогает декомпатизировать


ваши толстые модели ActiveRecord и сохранять ваш код тонким и
читабельным путем извлечения сложных SQL-запросов или областей в
отдельные классы, которые легко повторно использовать и тестировать.

https://dev.to/renatamarques97/design-patterns-with-ruby-on-rails-part-2-
query-object-1h65#:~:text=The%20query%20object%20is%20a,easy%20to
%20reuse%20and%20test.

Rake Task

Rake - это Ruby Make, автономная утилита Ruby, которая заменяет утилиту «make» Unix и
использует файлы «Rakefile» и .rake для создания списка задач.
Проще говоря:
Rake будет выполнять различные задачи (в основном набор кода ruby), указанные в любом
файле с расширением. rake из командной строки.

https://www.rubyguides.com/2019/02/ruby-rake/

Транзакции в Ruby и для чего они нужны?

Транзакции - это защитные блоки, где операторы SQL являются постоянными только в том
случае, если все они могут быть успешными как одно атомарное действие.

Классический пример - перевод между двумя счетами, где вы можете внести депозит только в
том случае, если снятие средств прошло успешно, и наоборот.

Транзакции обеспечивают целостность базы данных и защищают данные от программных


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

Kernal class

Kernal class ключен в класс Object, поэтому его методы доступны в каждом объекте Ruby.
Методы экземпляра ядра описаны в классе Object. В этом разделе описаны методы модуля.
Эти методы вызываются без приемника, поэтому их можно вызывать в функциональной
форме.

https://blog.appsignal.com/2019/05/07/method-missing.html Цепочка

Разница Class vs Module


Модули - это коллекции методов и констант. Они не могут создавать экземпляры. Классы
могут генерировать экземпляры (объекты) и иметь состояние для каждого экземпляра
(переменной экземпляра).

Вложенные Формы (Nested Form)

Nested form это форма для нескольких моделей

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

Полиморфные Связи

Полиморфные связи — это немного более сложный вид связей. Тк при помощи полиморфных
связяей модель может принадлежать более чем одной модели, на одиночной связи. Например,
имеется модель изображения, которая принадлежит или модели работника, или модели
продукта. В миграции обозначить

Наследование с единой таблицей (STI)

Иногда можно делиться полями и поведением между различными моделями. Для этого мы
должны добавить поле type, тк STI не работает без поля "type" в таблице. Для этого можно
использовать опцию --parent=PARENT, которая сгенерирует модель, унаследованную от
указанного родителя и без эквивалентной миграции (так как таблица уже существует).

Это означает, что все поведение, такое как связи, публичные методы и тд будет доступно и
для родителя, и для модели

Тестирование при помощи Rspec

(: let) никогда не оценивается до первого вызова метода, с которым он работает, а (: let!)


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

Проверка покрытия кода тестами проверяется при помощи simplecov(не менее 80%) дожно
быть покрытие.

Тулзы для тестировния

Timecop vcr

Mocks Studs и Double в Rspec

Mocks используется для проверки взаимодействия между двумя объектами.


Разница между Mocks vs Stubs заключается в том что Stubs это всего лишь метод с
шаблонным ответом, его не волнует поведение теста. В то время как Mocks ожидает вызова
методов, если они не вызываются, тест завершится ошибкой.

Double в может использоваться либо как stub (allow), либо как stub(expect) , и он проверит,
существует ли метод с этим именем.

Когда и что надо использовать при тестировании?

Если метод работает с внешними объектами и отправляет им что то, можно использовать
mocks для взаимодействия с этими объектами.

Если метод будет ожидать данные от API(например), можено использовать stubs для
предоставления этих данных в целях тестирования.

Но иногда надо отказываться от имитации классов, тк тесты становятся зависимым от


детализации и реализации кода, что в будущем может затруднить изменение кода.

Разница между Include и Extend

Главное отличие Include и Extend заключается в том, что "include" предназначен для
добавления методов только к экземпляру класса, а " Extend " предназначен для добавления
методов к классу.

https://www.geeksforgeeks.org/include-v-s-extend-in-ruby/#:~:text=In
%20simple%20words%2C%20the%20difference,but%20not%20to%20its
%20instance.

Фильтры в Rails (before, after, around)

Фильтры "before" могут прерывать цикл запроса. Обычный фильтр "before" - это, например,
тот, который требует, чтобы пользователь был авторизован для запуска экшна.

Фильтры "after" похожи на "before", но очевидно, фильтры "after" не могут остановить экшн
от запуска. Обратите внимание, что фильтры "after" выполняются только после успешного
выполнения экшна, но не при возникновении исключения в цикле запроса.
Фильтры "around" ответственны за запуск связанных с ними экшнов с помощью yield,
подобно тому, как работают промежуточные программы Rack.

Когда используется member, а когда Collection в routes?

:member используется, когда routes имеет уникальное поле: id


:collection используется, когда в routes нет уникального поля.
Redis

Redis база данных, работающая с хэшем. с открытым исходным кодом для структур данных
«ключ-значение». Самые распространенные примеры использования Redis включают
кэширование, управление сессиями и тд.

Глобальные переменные, нужно использовать или нет?

Глобальные переменные они доступны в любой части кода и они могу изменится затруднить
отлов багов

Index для БД

Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на


соответствующие строки таблицы и, таким образом, позволяет искать строки,
удовлетворяющие критерию поиска.

Как пример мы можем представить, что, Индекс можно представить


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

Мы можем гарантировать, что два или более индекса будут уникальными в нашей базе
данных, добавив уникальный параметр в конце. Для этого надо добавить unique: true.

Обратная сторона index

Индексы снижают производительность. В обмен на более быстрые поисковые запросы запись


и обновление базы данных происходит медленнее, так как поддержание индексов связано с
дополнительными расходами. Однако это негативное воздействие только добавляет
миллисекунды к времени записи в базу данных, что компенсируется экономией секунд (даже
минут) на поисковых запросах.

https://medium.com/@brettschules/add-index-rails-b68bf2d99d17

Where(Условие)

Метод where позволяет определить условия для ограничения возвращаемых записей, которые


представляют WHERE-часть выражения SQL. Условия могут быть заданы как строка, массив
или хэш.
Разница Having и Group By в SQL(Статья)

Предложение HAVING используется вместо WHERE с агрегатными функциями. В то время


как предложение GROUP BY группирует строки с одинаковыми значениями в итоговые
строки. Предложение Having используется с предложением where для поиска строк с
определенными условиями.

Разница между Put/Patch

PATCH используется для частичного изменения ресурса. PUT создает новый ресурс или


заменяет представление целевого ресурса, данными представленными в теле запроса.
Иными словами, в PATCH вложенный объект содержит набор инструкций, описывающих, как
ресурс, находящийся в данный момент на исходном сервере, должен быть модифицирован
для создания новой версии. А в PUT содержится новая версия ресурса целиком
Метопрограмировани в языке Ruby

Метопрогрумирование это возможность языка менять самого себя

Пример:
Изменение массивов при помощи метода(open class struct)

Alias метопрограмирование (если попросят привести примеры)