Rails без ActiveRecord:
старая-добрая рельса или
инвалид c костылями?
About me:
!
!
Ruslan Sharipov!
@sharipov_ru
!
!
in ruby-world since Rails 2.3
Всегда был фанатом Rails и ActiveRecord
Проект:
!
1 год активной разработки
3 разработчика-новичка в Rails
100% Rails-way
Мало тестов
!
Полгода спустя
Проект:
!
1.5 года активной разработки
Тонна rails-way кода
CI зелёный ~ раз в месяц, а то и реже
>500 opened Github issues (процентов 70 - баги)
1000-1500 LoC классы, vim тормозит
!
Недовольные разработчики

Недовольный заказчик
3-4 месяца в режиме bugfix-only
=> более-менее стабильный production
Всё ещё фанат Rails и ActiveRecord
Одно из наших решений - смена БД
для некоторых сущностей.
!
!
Встречаем RethinkDB!
RethinkDB:
ActiveRecord или DataMapper?
mongoid (ORM для MongoDB)
no-brainer (ORM для RethinkDB)
elasticsearch-persistense (ORM для ES)
!
не вывезут
Безболезненно заменить ActiveRecord
на другую ORM - невозможно
ActiveRecord troubles
Violation of SRP
Say goodbye to User class with >1000 LoC
Say goodbye to ActiveRecord-depended gems
Say goodbye to AR callbacks
ActiveRecord troubles
Слои приложения
тесно связаны друг с другом
ActiveRecord troubles
Persistence
Domain logic
Forms + validations
Observers
Callbacks
Tests
ActiveRecord model
ActiveRecord troubles
Persistence
Domain logic
Forms + validations
Observers
Callbacks
Tests
ActiveRecord model
Да, многое из того, что ^^выше^^ нам
пришлось/придётся переписать
Say goodbye
ActiveRecord-зависимым гемам:
!
devise, acts_as_paranoid/paranoia, acts_as_taggable,
nested_form, draper, paperclip, paper_trail, friendly_id,
auto_strip_attributes и ещё несколько тысячам :)
Прощаемся с
понятием “Рельса - чтобы формочки клепать”
С отпиленным от rails ORM это не так.
Представьте разработчика,
которому нужно склепать новую формочку
routes.rb
form_for
Ability.rb
request
params
polymorphic
associations
AR Serializers
ActiveModel
validations
url_for
form helpers
accept_nested_attributes_for
strong_parameters
csrf_token
ActionView
helpers
attr_accessible
Callbacks
Безболезненно выкинуть ActiveRecord
из этой истории очень сложно
Теряем:
Optimistic locking
Dirty tracking
ActiveRecord Serializers
ActiveRecord Observers
accept_nested_attributes_for
Callback hell
Головную боль при смене способа хранения :)
Приобретаем:
Простые PORO модели, репозитории, сервисы,
предсказуемый код
Независимые друг от друга слои
!
Руслан, а ты читал
статью CodeClimate
“7 patterns to refactor fat
ActiveRecord models?!”
ServiceObjects оперируют с ActiveRecord
FormObjects отвечают за хранение
QueryObjects оперируют с ActiveRecord
Decorator также тесно связан с ActiveRecord
Было так:
Слои приложения
тесно связаны друг с другом
FormObject ServiceObject QueryObject
Decorator
Стало так:
Не сильно лучше
Conclusion…
Хорошая архитектура - редко с ActiveRecord
Conclusion…
Выкинуть ActiveRecord обычно == поломать всё
Conclusion…
Выкинуть ActiveRecord == почти выкинуть Rails

Rails без ActiveRecord: старая-добрая рельса или инвалид c костылями?