HASHROCKET EXPERTLY CRAFTED WEB The Rich Get Richer: RAILS 3 PRESENTED BY OBIE FERNANDEZ Sunday, December 5, 2010
About 20k USD Sunday, December 5, 2010
About 45k USD Sunday, December 5, 2010
About 200k USD Sunday, December 5, 2010
“a few million dollars” Sunday, December 5, 2010
Sunday, December 5, 2010
HASHROCKET EXPERTLY CRAFTED WEB OMG RAILS 3 ROCKS SO MUCH MORE THAN RAILS 2!!! PRESENTED BY OBIE FERNANDEZ Sunday, December 5, 2010
How is Rails 3 Richer? mainstream adoption maturity performance open-source mindshare CAUTION: JUST A METAPHOR Sunday, December 5, 2010
Sunday, December 5, 2010
The Rich Get Richer: RAILS 3 OBIE FERNANDEZ Presentation Overview • History and Context • What’s new • ActiveRecord Performance • Impact on Application Development Sunday, December 5, 2010
Sunday, December 5, 2010
Ezra Zygmuntovich Sunday, December 5, 2010
merb [...] clocks in at 17,291 [loc]. Rails clocks in at 47,195. As you can see, it’s a tie. Sunday, December 5, 2010
Yehuda Katz Sunday, December 5, 2010
December 23, 2008 Sunday, December 5, 2010
David Heinemeir Hansson Sunday, December 5, 2010
Tom Mornini Photo Credit: Sebastian Delmont Sunday, December 5, 2010
Tom Mornini Photo Credit: Sebastian Delmont Sunday, December 5, 2010
Sunday, December 5, 2010
Sunday, December 5, 2010
Q: How do you prevent bloating? Ryan Sanchez's "Violet Beauregarde" ("Charlie and the Chocolate Factory") Photo by Tera Heater/ MTV News Sunday, December 5, 2010
A: Decoupling http://yestheykeepmebusy.blogspot.com/2009/11/willy-wonka- halloween.html Sunday, December 5, 2010
A: Modularity http://superpunch.blogspot.com/2009/10/lego-violet-beauregarde-and- more.html Sunday, December 5, 2010
require 'active_support/concern' require 'active_support/ordered_options' require 'active_support/core_ext/kernel/singleton_class' require 'active_support/core_ext/module/delegation' module ActiveSupport # Configurable provides a <tt>config</tt> method to store and retrieve # configuration options as an <tt>OrderedHash</tt>. module Configurable extend ActiveSupport::Concern class Configuration < ActiveSupport::InheritableOptions def compile_methods! self.class.compile_methods!(keys.reject {|key| respond_to?(key)}) end # compiles reader methods so we don't have to go through method_missing def self.compile_methods!(keys) keys.each do |key| class_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{key}; _get(#{key.inspect}); end RUBY end end end ... Sunday, December 5, 2010
Sunday, December 5, 2010
Rails 3.0 August 29, 2010 SA Sunday, December 5, 2010
The Rich Get Richer: RAILS 3 OBIE FERNANDEZ Notable Plugin Changes • Formtastic 1.1 (made compatible) • InheritedResources 1.1 (rewritten) • Devise (significant upgrades) • RSpec 2 (rewritten) • EmailSpec 1.0 (rewritten) • MetaSearch (instead of Searchlogic) Sunday, December 5, 2010
Sunday, December 5, 2010
Sunday, December 5, 2010
What’s new in Rails 3? Sunday, December 5, 2010
Sunday, December 5, 2010
Sunday, December 5, 2010
config/routes.rb Sunday, December 5, 2010
# This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) run Example::Application config.ru Sunday, December 5, 2010
Rack::Cache ActionDispatch::Static Rack::Lock Rack::Runtime Rails::Rack::Logger ActionDispatch::ShowExceptions ActionDispatch::RemoteIp Rack::Sendfile ActionDispatch::Callbacks ActionDispatch::Cookies ActionDispatch::Flash ActionDispatch::ParamsParser Rack::MethodOverride ActionDispatch::Head Rack::ConditionalGet Rack::ETag ActionDispatch::BestStandardsSupport Rails 3 Middleware “Stack” Sunday, December 5, 2010
Sunday, December 5, 2010
Sunday, December 5, 2010
Sunday, December 5, 2010
gem "rails", "3.0.1" gem 'jquery-rails' gem "mysql" gem "haml", "3.0.18" gem "decent_exposure", "1.0.0.rc1" gem "devise", "1.1.3" gem "chronic", "0.2.3" gem "seed-fu", "1.2.3", :git => "git://github.com/supaspoida/seed-fu.git" gem "block_helpers", "0.3.3" gem "will_paginate", "3.0.pre2" gem "geokit", "1.5.0" group :test do gem "capybara", "0.3.9" gem 'database_cleaner', '0.5.0' gem 'launchy', '0.3.7' gem "rspec-rails", "2.0.1" gem "mocha", "0.9.9" gem "shoulda", "2.11.3" gem "selenium-webdriver" gem "timecop", "0.3.5" gem "watchr" gem "specjour", "0.3.1" Gemfile gem "email_spec", "1.0.0" end Sunday, December 5, 2010
$ bundle Fetching source index for http://rubygems.org Using rake (0.8.7) Using abstract (1.0.0) Using activesupport (3.0.1) Using builder (2.1.2) Using i18n (0.4.2) Using activemodel (3.0.1) ... Your bundle is complete! It was installed into /Users/obie/.rvm/gems/ruby-1.9.2- p0@example-application Sunday, December 5, 2010
Sunday, December 5, 2010
Arel by Nick Kallen Sunday, December 5, 2010
Sunday, December 5, 2010
“closure under composition” Sunday, December 5, 2010
User.find :conditions => { :name => "obie" } # in Rails 3 becomes User.where(:name => "obie") Sunday, December 5, 2010
>> u = User.where(first_name: "Pascale"); u.to_sql => "SELECT `users`.* FROM `users` WHERE (`users`.`first_name` = 'Pascale') >> u.where(age: 21).to_sql => "SELECT `users`.* FROM `users` WHERE (`users`.`first_name` = 'Pascale') AND (`users`.`age` = 21)" >> u.order(:name).limit(20).to_sql => "SELECT `users`.* FROM `users` WHERE (`users`.`first_name` = 'Pascale') ORDER BY name LIMIT 20" Sunday, December 5, 2010
class Invitation < ActiveRecord::Base default_scope order("created_at DESC") scope :accepted, where("accepted_at is NOT NULL") scope :pending, where(accepted_at: nil) ... end Scopes Sunday, December 5, 2010
All of my open-sourced projects share two attributes. First, the source code is extremely stylized and meant to be /read/ more than /used/. They are literary arguments in code much more than a useful piece of infrastructure. If you read the source-code to Arel you will see a highly a fg ected "combinator" and "interpreter" style of coding. Nick Kallen Sunday, December 5, 2010
“Holy shit, Rails 3 is slow!” Sunday, December 5, 2010
#5098 Sunday, December 5, 2010
joins = [{:dim_locations=>[:dim_zip, {:dim_city=> {:dim_state=>:dim_country}}]}, :dim_ages, :dim_car_makes, :dim_educations, :dim_employments, :dim_foods, :dim_genders, :dim_get_aways, :dim_home_ownerships, :dim_incomes, :dim_marital_statuses, :dim_teams] conditions = ["(dim_zips.zip_code = ? OR dim_zips.zip_code IS NULL) AND (dim_cities.city = ? OR dim_cities.city IS NULL) AND (dim_states.state_code = ? OR dim_states.state_code IS NULL) AND (dim_states.state = ? OR dim_states.state IS NULL) AND (dim_countries.country_code = ? OR dim_countries.country_code IS NULL) AND (dim_countries.country = ? OR dim_countries.country IS NULL) AND (dim_ages.age = ? OR dim_ages.age IS NULL) AND (dim_car_makes.car_make IN (?) OR dim_car_makes.car_make IS NULL) AND (dim_educations.education = ? OR dim_educations.education IS NULL) AND (dim_employments.employment = ? OR dim_employments.employment IS NULL) AND (dim_foods.food IN (?) OR dim_foods.food IS NULL) AND (dim_genders.gender = ? OR dim_genders.gender IS NULL) AND (dim_get_aways.get_away IN (?) OR dim_get_aways.get_away IS NULL) AND (dim_home_ownerships.home_ownership = ? OR dim_home_ownerships.home_ownership IS NULL) AND (dim_incomes.income = ? OR dim_incomes.income IS NULL) AND (dim_marital_statuses.marital_status = ? OR dim_marital_statuses.marital_status IS NULL) AND (dim_teams.team IN (?) OR dim_teams.team IS NULL)", "98104", "Seattle", "WA", "Washington", "US", "United States of America", "18-34", ["Ashton Martin"], "Bachelors", "Full Time", ["Brazilian"], "Male", ["France"], "Rent", "Less than 30k", "Married", ["Arizona Cardinals", "Boston Bruins"]] Benchmark.measure do Koupon.includes(joins).where(conditions).each end => 127.930000 0.390000 128.320000 (129.897278) Sunday, December 5, 2010
Sunday, December 5, 2010
O(n^2) vs O(n) Sunday, December 5, 2010
routing Sunday, December 5, 2010
Recommend
More recommend