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

How I architected my big Rails app for success!...

How I architected my big Rails app for success! (ConFoo 2014)

Avatar for Benjamin Smith

Benjamin Smith

February 28, 2014
Tweet

More Decks by Benjamin Smith

Other Decks in Technology

Transcript

  1. How I architected my big Rails app for success! Benjamin

    Smith @benjamin_smith Friday, February 28, 14
  2. success • long project • big dev team • lots

    of code • scalable • big 1st release @benjamin_smith Friday, February 28, 14
  3. success • long project • big dev team • lots

    of code • scalable • big 1st release @benjamin_smith Friday, February 28, 14
  4. the product • Multimedia content publishing • A social network

    • iOS app for consumers (using JSON API) • CMS (web interface) for admins @benjamin_smith Friday, February 28, 14
  5. 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 Friday, February 28, 14
  6. 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 Friday, February 28, 14
  7. self contained engines • all tables namespaced • migrations •

    tests @benjamin_smith Friday, February 28, 14
  8. 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/ Friday, February 28, 14
  9. self contained engines • all tables namespaced • migrations •

    tests @benjamin_smith Friday, February 28, 14
  10. class User < ActiveRecord::Base has_many :posts end class Post <

    ActiveRecord::Base belongs_to :user end Friday, February 28, 14
  11. domain api • simple classes to wrap ActiveRecord calls •

    take as input: params or ids • output PORO @benjamin_smith Friday, February 28, 14
  12. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Friday, February 28, 14
  13. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Friday, February 28, 14
  14. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Friday, February 28, 14
  15. 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 Friday, February 28, 14
  16. 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) Friday, February 28, 14
  17. 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) Friday, February 28, 14
  18. engines are a pain... • LOW velocity for first 4-6

    weeks • 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 Friday, February 28, 14
  19. ... 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 Friday, February 28, 14
  20. class UserManager def find_by_id(id) User.new(UserRecord.find(id)) end private class UserRecord <

    ActiveRecord::Base validates :email, presence: true end end Friday, February 28, 14