Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Keeping Your Massive Rails App From Turning Int...

Avatar for Benjamin Smith Benjamin Smith
September 12, 2013

Keeping Your Massive Rails App From Turning Into a S#!t Show (WindyCityRails 2013)

Avatar for Benjamin Smith

Benjamin Smith

September 12, 2013
Tweet

More Decks by Benjamin Smith

Other Decks in Technology

Transcript

  1. Keeping Your Massive Rails App From Turning Into a S#!t

    Show Benjamin Smith Thursday, September 12, 13
  2. Keeping Your Massive Rails App From Turning Into a S#!t

    Show Benjamin Smith Thursday, September 12, 13
  3. Keeping Your Massive Rails App From Turning Into a S#!t

    Show Benjamin Smith Thursday, September 12, 13
  4. Keeping Your Massive Rails App From Turning Into a S#!t

    Show Benjamin Smith @benjamin_smith Thursday, September 12, 13
  5. Keeping Your Massive Rails App From Turning Into a S#!t

    Show By Architecting It For Success Benjamin Smith Success @benjamin_smith Thursday, September 12, 13
  6. success • long project • big dev team • lots

    of code • scalable • big 1st release @benjamin_smith Thursday, September 12, 13
  7. success • long project • big dev team • lots

    of code • scalable • big 1st release @benjamin_smith Thursday, September 12, 13
  8. the product • Multimedia content publishing • A social network

    • iOS app for consumers (using JSON API) • CMS (Rails) for admins @benjamin_smith Thursday, September 12, 13
  9. s/engine_template/new_engine_name/g s/EngineTemplate/NewEngineName/g for file in $(find . -name "*engine_template*") do

    mv $file `echo $file | sed s/engine_template/$1/` done @benjamin_smith Thursday, September 12, 13
  10. bundle gem gem_template s/gem_template/new_gem_name/g s/GemTemplate/NewGemName/g for file in $(find .

    -name "*gem_template*") do mv $file `echo $file | sed s/gem_template/$1/` done @benjamin_smith Thursday, September 12, 13
  11. fully contained engines • all tables namespaced • migrations •

    tests @benjamin_smith Thursday, September 12, 13
  12. module EngineWithMigrations class Engine < ::Rails::Engine isolate_namespace EngineWithMigrations initializer :append_migrations

    do |app| unless app.root.to_s.match root.to_s app.config.paths["db/migrate"] += config.paths["db/migrate"].expanded end end end end http://pivotallabs.com/leave-your-migrations-in-your-rails- engines/ Thursday, September 12, 13
  13. fully contained engines • all tables namespaced • migrations •

    tests @benjamin_smith Thursday, September 12, 13
  14. class User < ActiveRecord::Base has_many :posts end class Post <

    ActiveRecord::Base belongs_to :user end Thursday, September 12, 13
  15. domain api • simple classes to wrap ActiveRecord calls •

    take as input: params or ids • output PORO @benjamin_smith Thursday, September 12, 13
  16. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Thursday, September 12, 13
  17. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Thursday, September 12, 13
  18. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Thursday, September 12, 13
  19. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end class User def initialize(user_record) self.email = user_record.email end end Thursday, September 12, 13
  20. class PostManager def find_all_by_user_id(user_id) PostRecord.where(user_id: user_id) # ... convert to

    PORO ... end end post_manager = PostManager.new @posts = post_manager.find_all_by_user_id(@user.id) Thursday, September 12, 13
  21. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end end user_manager = UserManager.new

    author = user_manager.find_by_id(@post.user_id) Thursday, September 12, 13
  22. I live my life one green build at a time

    Thursday, September 12, 13
  23. engines are a pain... • LOW velocity for weeks (4-6)

    • client worries • opposite of Rails • one pair to start is a MUST • some technical hurtles • must be diligent about refactoring • monkey patching Rails @benjamin_smith Thursday, September 12, 13
  24. ... but they get better • no slow down in

    development time • they age well • easier parallel development • potential for scaling • smart and fast build scripts @benjamin_smith Thursday, September 12, 13
  25. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Thursday, September 12, 13