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

Rails Magic Exposed

Rails Magic Exposed

The Ruby that powers Rails.. LoneStarRubyConf 2012

Jesse Wolgamott

August 11, 2012
Tweet

More Decks by Jesse Wolgamott

Other Decks in Programming

Transcript

  1. Rails
    magic
    Saturday, August 11, 12

    View Slide

  2. EPFT
    NBHJD
    FYJTU
    Saturday, August 11, 12

    View Slide

  3. MFU`TBTL
    4$*&/$&
    Saturday, August 11, 12

    View Slide

  4. (PPHMF
    3FTVMUT
    Saturday, August 11, 12

    View Slide

  5. Framework Magic Total
    php (1994) 132000 2.527E+10
    java (1995) 45900 960000000
    .net (2002) 4400 250000000
    django (2004) 9370 44300000
    rails (2005) 7040 20300000
    Saturday, August 11, 12

    View Slide

  6. .BHJD3BUJP
    w1)1
    w+BWB
    w/&5
    Saturday, August 11, 12

    View Slide

  7. .BHJD3BUJP
    w%KBOHP
    w3BJMT
    Saturday, August 11, 12

    View Slide

  8. 0
    1
    2
    3
    4
    php (1994) java (1995) .net (2002) django (2004) rails (2005)
    0.052
    0.478
    0.176
    2.115
    3.468
    Magic over Time
    Frequency / 10000
    Saturday, August 11, 12

    View Slide

  9. 0
    1
    2
    3
    4
    php (1994) java (1995) .net (2002) django (2004) rails (2005) Node
    0.052
    0.478
    0.176
    2.115
    3.468
    2.031
    A Step Back
    Saturday, August 11, 12

    View Slide

  10. 0
    100
    200
    300
    400
    php (1994) .net (2002) rails (2005) Meteor.js
    0.052 0.478 0.176 2.115 3.468 2.031
    345.810
    MAGIC of Meteor
    Saturday, August 11, 12

    View Slide

  11. l"OZTVGpDJFOUMZ
    BEWBODFE
    UFDIOPMPHZJT
    JOEJTUJOHVJTIBCMF
    GSPNNBHJDz
    "SUIVS$$MBSL
    Saturday, August 11, 12

    View Slide

  12. dynamic
    finders
    Saturday, August 11, 12

    View Slide

  13. id = params[:customer_id]
    YourModel.find_by_customer_id id
    Saturday, August 11, 12

    View Slide

  14. def method_missing(method_id, *arguments)
    if match = /find_(all_by|by)_([_a-zA-Z]\w*)/.
    match(method_id.to_s)
    # find...
    elsif match = /find_or_create_by_([_a-zA-Z]
    \w*)/.
    match(method_id.to_s)
    # find_or_create...
    else
    super
    end
    end
    Saturday, August 11, 12

    View Slide

  15. magic
    columns
    Saturday, August 11, 12

    View Slide

  16. created_at and updated_at
    counter_caches
    type
    Saturday, August 11, 12

    View Slide

  17. def apply_it(items)
    items.map do |item|
    item.apply! if item.respond_to?
    (:apply!)
    end
    end
    Saturday, August 11, 12

    View Slide

  18. Active
    Record
    definition
    Saturday, August 11, 12

    View Slide

  19. class User < ActiveRecord::Base
    has_many :posts
    has_many :comments, through: :posts
    validates_presence_of :email
    end
    Saturday, August 11, 12

    View Slide

  20. class SuperWo
    20.times {|i| puts "This is the #{i}”}
    def wat!
    puts "hi"
    end
    end
    SuperWo.new.wat!
    Try it out: http://rubyfiddle.com/riddles/a63dd
    Saturday, August 11, 12

    View Slide

  21. auto
    loading
    Saturday, August 11, 12

    View Slide

  22. Dir.glob('./app/models/*').each do |file|
    require file
    end
    require_relative 'db/setup'
    require_relative 'models/page'
    require_relative 'models/book'
    Saturday, August 11, 12

    View Slide

  23. CFDBVTF
    "DUJWF4VQQPSU
    %FQFOEFODJFT
    VSM
    IUUQSLIJN
    DPEFSFMPBEJOH
    Saturday, August 11, 12

    View Slide

  24. # Extremely simple autoloading implementation
    class Module
    alias const_missing_without_autoloading const_missing
    def const_missing(const)
    path = “./#{name.gsub('::', '/')}/#{const}"
    path.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
    require path.downcase
    const_defined?(const) ? const_get(const) : super
    rescue LoadError => error
    warn(error.message)
    super
    end
    end
    Saturday, August 11, 12

    View Slide

  25. "VUP-PBEJO"DUJPO
    HJUIVCKXP
    DMPBLFEUZSJPO
    Saturday, August 11, 12

    View Slide

  26. 4PNVDINPSF
    Saturday, August 11, 12

    View Slide

  27. class Foo
    @@foo ||= 42
    puts @@foo # 42
    end
    # reload...
    class Foo
    @@foo ||= 23
    puts @@foo # 42
    end
    Saturday, August 11, 12

    View Slide

  28. # reload...
    Object.send(:remove_const, :Foo)
    class Foo
    @@foo ||= 23
    puts @@foo # 23
    end
    Saturday, August 11, 12

    View Slide

  29. custom
    ruby
    Saturday, August 11, 12

    View Slide

  30. NPOLFZQBUDIJOH

    Saturday, August 11, 12

    View Slide

  31. numbers = (1..100).to_a
    numbers.first
    numbers.last
    numbers.forty_two
    Saturday, August 11, 12

    View Slide

  32. def forty_two
    self[41]
    end
    "MTPLOPXOBTBDDFTTJOHUIF
    SFEEJU
    Saturday, August 11, 12

    View Slide

  33. class Enumerable
    def standard_dev
    Math.sqrt(sample_variance)
    end
    def sample_variance
    mean = sum.to_f / size.to_f
    sum{|i| (i-mean)**2} / size
    end
    end
    Saturday, August 11, 12

    View Slide

  34. review
    Saturday, August 11, 12

    View Slide

  35. [email protected]
    [email protected]
    Saturday, August 11, 12

    View Slide

  36. [email protected]
    [email protected]
    Saturday, August 11, 12

    View Slide

  37. [email protected]
    [email protected]@DPEF
    Saturday, August 11, 12

    View Slide

  38. [email protected]MPBEJOH
    [email protected]
    Saturday, August 11, 12

    View Slide

  39. [email protected]
    [email protected]
    Saturday, August 11, 12

    View Slide

  40. @@jwo
    ruby off
    rails
    Saturday, August 11, 12

    View Slide