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

Post on 16-Aug-2015

35 views 4 download

Transcript of Rails без ActiveRecord: старая-добрая рельса или инвалид c...

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