rails без activerecord: старая-добрая рельса или инвалид c...
TRANSCRIPT
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 LoCSay 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_forAbility.rb
request params
polymorphic associationsAR Serializers
ActiveModel validations
url_for
form helpers
accept_nested_attributes_for
strong_parameters
csrf_token
ActionView helpers
attr_accessible
Callb
acks
Безболезненно выкинуть 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