MicroORM — это легкая, идиоматичная Object-Relational Mapping (ORM) библиотека на Ruby, разработанная для глубокого понимания механизмов метапрограммирования, паттерна Active Record, ленивых вычислений и архитектуры гемов.
Библиотека наглядно демонстрирует внутреннее устройство современных ORM (таких как Rails Active Record): маппинг строк SQLite в объекты Ruby, динамическую генерацию методов, цепочки ленивых запросов, валидации, коллбеки жизненного цикла, DSL-спецификации для тестов на RSpec и управление миграциями через CLI.
- Язык: Ruby 3.x
- База данных: SQLite3 (
>= 2.0) - Тестирование: RSpec 3.x
- Инструменты: OptionParser, Bundler / Gem Specification
- Паттерны: Active Record Pattern, Domain Specific Language (DSL), Lazy Evaluation, Closures / Procs.
-
Автоматическое сопоставление таблиц: Класс
Userавтоматически связывается с таблицей"users",BlogPost$\rightarrow$ "blog_posts". -
Безопасный SQL: Все запросы используют биндинги параметров (prepared statements
?) для защиты от SQL-инъекций. -
Единый коннектор:
MicroORM::Connectionуправляет потокобезопасным подключением к SQLite3.
- Фоллбэк через
method_missing: Динамическое чтение и запись атрибутов (user.name = "Alex",user.name). - DSL
columns: Опциональная явная генерация геттеров и сеттеров при необходимости. - Динамический поиск: Методы
find(id),allиfind_by(...)по произвольному набору параметров.
- Класс
MicroORM::Relation: Построение цепочек методов (.where(...),.limit(...),.order(...)) без моментального обращения к БД. - Интеграция с
Enumerable: Запрос выполняется отложено — только в момент реального обращения к данным (.each,.first,.map).
- Умный
save: Автоматически определяет тип операции:INSERT(для новых объектов) илиUPDATE(при наличииid). - Методы жизненного цикла:
create,update,destroyс заморозкой состояния объекта (@attributes.freeze) после удаления.
has_manyиbelongs_to: Связывание моделей между собой.- Гибкая настройка: Поддержка кастомных параметров
class_nameиforeign_key. - Цепочки связей: Вызов
user.postsвозвращаетRelation, позволяя выполнять запросы видаuser.posts.where(...).
- DSL
validates: Проверка обязательных полей (presence: true). - Хэш ошибок
@errorsи методvalid?: Блокировка сохранения невалидных данных в БД со сбором понятных сообщений об ошибках.
- Хуки
before_saveиafter_create: Автоматический запуск кода перед сохранением или сразу после создания записи. - Поддержка типов: Принимает как символы методов (
:strip_name), так и анонимные блоки (Proc/lambda).
micro_orm/
├── lib/
│ ├── micro_orm.rb # Главная точка входа гема
│ └── micro_orm/
│ ├── base.rb # Основной класс модели (ActiveRecord)
│ ├── connection.rb # Синглтон подключения к SQLite3
│ └── relation.rb # Ленивый конструктор запросов