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

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

Embed Size (px)

Citation preview

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

Rails без ActiveRecord:

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

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

About me: !!

Ruslan Sharipov!@sharipov_ru

!!

in ruby-world since Rails 2.3

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

Всегда был фанатом Rails и ActiveRecord

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

Проект: !

1 год активной разработки 3 разработчика-новичка в Rails

100% Rails-way Мало тестов

!

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

Полгода спустя

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

Проект: !

1.5 года активной разработки Тонна rails-way кода

CI зелёный ~ раз в месяц, а то и реже >500 opened Github issues (процентов 70 - баги)

1000-1500 LoC классы, vim тормозит !

Недовольные разработчики Недовольный заказчик

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

3-4 месяца в режиме bugfix-only => более-менее стабильный production

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

Всё ещё фанат Rails и ActiveRecord

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

Одно из наших решений - смена БД для некоторых сущностей.

!

!

Встречаем RethinkDB!

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

RethinkDB: ActiveRecord или DataMapper?

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

mongoid (ORM для MongoDB) no-brainer (ORM для RethinkDB)

elasticsearch-persistense (ORM для ES) !

не вывезут

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

Безболезненно заменить ActiveRecord на другую ORM - невозможно

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

ActiveRecord troubles

Violation of SRP

Say goodbye to User class with >1000 LoCSay goodbye to ActiveRecord-depended gems

Say goodbye to AR callbacks

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

ActiveRecord troubles

Слои приложения тесно связаны друг с другом

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

ActiveRecord troubles

Persistence Domain logic

Forms + validations Observers Callbacks

Tests

ActiveRecord model

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

ActiveRecord troubles

Persistence Domain logic

Forms + validations Observers Callbacks

Tests

ActiveRecord model

Да, многое из того, что ^^выше^^ нам пришлось/придётся переписать

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

Say goodbye ActiveRecord-зависимым гемам:

!devise, acts_as_paranoid/paranoia, acts_as_taggable, nested_form, draper, paperclip, paper_trail, friendly_id,

auto_strip_attributes и ещё несколько тысячам :)

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

Прощаемся с понятием “Рельса - чтобы формочки клепать”

С отпиленным от rails ORM это не так.

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

Представьте разработчика, которому нужно склепать новую формочку

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

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

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

Безболезненно выкинуть ActiveRecord из этой истории очень сложно

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

Теряем:Optimistic locking Dirty tracking ActiveRecord Serializers ActiveRecord Observers accept_nested_attributes_for Callback hell Головную боль при смене способа хранения :)

Приобретаем:Простые PORO модели, репозитории, сервисы, предсказуемый код Независимые друг от друга слои !

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

Руслан, а ты читал статью CodeClimate

“7 patterns to refactor fat ActiveRecord models?!”

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

ServiceObjects оперируют с ActiveRecord FormObjects отвечают за хранение

QueryObjects оперируют с ActiveRecord Decorator также тесно связан с ActiveRecord

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

Было так:

Слои приложения тесно связаны друг с другом

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

FormObject ServiceObject QueryObject

Decorator

Стало так:

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

Не сильно лучше

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

Conclusion…

Хорошая архитектура - редко с ActiveRecord

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

Conclusion…

Выкинуть ActiveRecord обычно == поломать всё

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

Conclusion…

Выкинуть ActiveRecord == почти выкинуть Rails