SlideShare une entreprise Scribd logo
1  sur  119
Active Record
Conhecendo melhor sua ferramenta de persistência



                   Anderson Leite
                  @anderson_leite
              www.andersonleite.com.br
            anderson.leite@caelum.com.br
RR-71   RR-75
Active Record
   [ORM]
SHOW ME
THE CODE!
app/models
app/models
class Participante < ActiveRecord::Base
end
app/models
 class Participante < ActiveRecord::Base
 end


participante = Participante.new
app/models
 class Participante < ActiveRecord::Base
 end


participante = Participante.new
participante.nome = ‘Anderson’
Metaprogramação
Metaprogramação
    Open Classes
Metaprogramação
    Open Classes

                   Monkeypatch
Metaprogramação
    Open Classes

                   Monkeypatch

           Method Missing
Metaprogramação
        Open Classes

                       Monkeypatch

 Mimic Mehods   Method Missing
Metaprogramação
          Open Classes

Ghost Methods            Monkeypatch

   Mimic Mehods   Method Missing
class Aluno
end
class Aluno
end
class Aluno   aluno = Aluno.new
end
class Aluno   aluno = Aluno.new
end           aluno.fala()
class Aluno   aluno = Aluno.new
end           aluno.fala()
              NoMethodError
class Aluno            aluno = Aluno.new
end                    aluno.fala()
                       NoMethodError
class Escola
  def ensina(aluno)
   def aluno.fala
     puts “falando!”
   end
  end
end
class Aluno            aluno = Aluno.new
end                    aluno.fala()
                       NoMethodError
class Escola
  def ensina(aluno)
   def aluno.fala
     puts “falando!”
   end
  end
end
class Aluno             aluno = Aluno.new
end                     aluno.fala()
                        NoMethodError
class Escola
  def ensina(aluno)    escola = Escola.new
   def aluno.fala
     puts “falando!”
   end
  end
end
class Aluno             aluno = Aluno.new
end                     aluno.fala()
                        NoMethodError
class Escola
  def ensina(aluno)    escola = Escola.new
   def aluno.fala      escola.ensina(aluno)
     puts “falando!”
   end
  end
end
class Aluno             aluno = Aluno.new
end                     aluno.fala()
                        NoMethodError
class Escola
  def ensina(aluno)    escola = Escola.new
   def aluno.fala      escola.ensina(aluno)
     puts “falando!”
   end                 aluno.fala()
  end
end
class Aluno             aluno = Aluno.new
end                     aluno.fala()
                        NoMethodError
class Escola
  def ensina(aluno)    escola = Escola.new
   def aluno.fala      escola.ensina(aluno)
     puts “falando!”
   end                 aluno.fala()
  end                  #=> falando!
end
Open Classes
class Aluno             aluno = Aluno.new
end                     aluno.fala()
                        NoMethodError
class Escola
  def ensina(aluno)    escola = Escola.new
   def aluno.fala      escola.ensina(aluno)
     puts “falando!”
   end                 aluno.fala()
  end                  #=> falando!
end
Aluno
aluno   Aluno
aluno   Aluno
aluno            Aluno



        #aluno
         fala
aluno            Aluno



        #aluno
         fala
aluno            Aluno



        #aluno
         fala
aluno            Aluno



        #aluno
         fala
aluno            Aluno   aluno2



        #aluno
         fala
aluno            Aluno   aluno2



        #aluno
         fala
Eigenclass
aluno            Aluno   aluno2



        #aluno
         fala
app/models
 class Participante < ActiveRecord::Base
 end


participante = Participante.new
participante.nome = ‘Anderson’
BD
BD
BD   Colunas
BD     Colunas

Open Classes
BD       Colunas

    Open Classes
def nome=(nome)
 @nome = nome
end
BD        Colunas

    Open Classes
def nome=(nome)   def nome
 @nome = nome      @nome
end               end
Dynamic Attributes
Dynamic Attributes
  Mimic Methods
Dynamic Attributes
  Mimic Methods
Dynamic Attributes
         Mimic Methods



activerecord-2.3.5/lib/active_record/attribute_methods.rb
Dynamic Attributes

Validations

Dynamic Finders
Dynamic Attributes

Validations

Dynamic Finders
SHOW ME
THE CODE!
class Participante < ActiveRecord::Base
validate :primeira_letra_maiuscula

 private
 def primeira_letra_maiuscula
  errors.add(...) unless nome =~ /[A-Z].*/
 end
end
class Participante < ActiveRecord::Base
  validates_presence_of :nome
  validates_length_of :nome, :minimum => 6
end
class Aluno
end
class Aluno
end
class Aluno
              ruby aluno.rb
end
class Aluno
                 ruby aluno.rb
end


class Aluno
  puts “teste”
end
class Aluno
                 ruby aluno.rb
end


class Aluno
  puts “teste”
end
class Aluno
                 ruby aluno.rb
end


class Aluno      ruby aluno.rb
  puts “teste”
end
class Aluno
                 ruby aluno.rb
end


class Aluno      ruby aluno.rb
  puts “teste”
                 #=> teste
end
class Participante < ActiveRecord::Base
  validates_presence_of :nome
  validates_length_of :nome, :minimum => 6
end
class Participante < ActiveRecord::Base
  validates_presence_of :nome
  validates_length_of :nome, :minimum => 6
end


             participante.save
onde?
onde?
rails/active_record/lib/active_record/base.rb
onde?
rails/active_record/lib/active_record/base.rb
onde?
rails/active_record/lib/active_record/base.rb

                  não...
rails/active_record/lib/active_record.rb
rails/active_record/lib/active_record.rb
rails/active_record/lib/active_record.rb
autoload?
rails/active_record/lib/active_record/base.rb
include + autoload
include + autoload

mas o que ele faz?
module ActiveRecord
  module Validations
    def self.included(base)
module ActiveRecord
  module Validations
    def self.included(base)
      alias_method_chain :save, :validation
module ActiveRecord
  module Validations
    def self.included(base)
      alias_method_chain :save, :validation



             1) autoload
module ActiveRecord
  module Validations
    def self.included(base)
      alias_method_chain :save, :validation



             1) autoload
             2) include
module ActiveRecord
  module Validations
    def self.included(base)
      alias_method_chain :save, :validation



             1) autoload
             2) include
             3) filtra o método save
validates_size_of
validates_uniqueness_of
validates_format_of
validates_numericality_of
validates_acceptance_of
validates_associated
validates_confirmation_of
validates_each
validates_exclusion_of
validates_inclusion_of
validates_length_of
validates_presence_of
algumas conclusões
    até aqui...
algumas conclusões
    até aqui...
     metaprogramação
algumas conclusões
    até aqui...
     metaprogramação

      Monkeypatch
algumas conclusões
    até aqui...
     metaprogramação

      Monkeypatch

       boas práticas
algumas conclusões
    até aqui...
     metaprogramação

      Monkeypatch

       boas práticas
         módulos
Dynamic Attributes

Validations

Dynamic Finders
SHOW ME
THE CODE!
autoload ?
 include ?
autoload ?
 include ?
 find_all_by_nome
autoload ?
 include ?
 find_all_by_nome
 find_all_by_email
autoload ?
  include ?
    find_all_by_nome
     find_all_by_email
find_all_by_nome_and_email
class Aluno
end
class Aluno
end
class Aluno
class Aluno     def method_missing()
end               #...
                end
              end
class Aluno
class Aluno                 def method_missing()
end                           #...
                            end
                          end


              aluno = Aluno.new
class Aluno
class Aluno                 def method_missing()
end                           #...
                            end
                          end


              aluno = Aluno.new
                 aluno.estuda()
def method_missing(name, *args)
end
def method_missing(name, *args)
end


          CoC
def method_missing(name, *args)
    end


               CoC
Participante.find_all_by_nome(“Anderson”)
def method_missing(name, *args)
    end


               CoC
Participante.find_all_by_nome(“Anderson”)
def method_missing(name, *args)
    end


               CoC
Participante.find_all_by_nome(“Anderson”)


         select * from Participante
         where nome= ‘Anderson’
Ghost Methods
Dynamic Attributes

Validations

Dynamic Finders
E agora ...pra onde ir ?
         > Ajax
         > Plugins
         > Testes




RR-71            RR-75
Obrigado!
       Anderson Leite

      @anderson_leite
  www.andersonleite.com.br
anderson.leite@caelum.com.br

Contenu connexe

Similaire à Active record

Ruby
RubyRuby
Rubybesen
 
Introdução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyIntrodução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyDiego Rubin
 
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...Rogério Moraes de Carvalho
 
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptTDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptRogério Moraes de Carvalho
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Julio Betta
 
Apresentação ruby + rails
Apresentação ruby + railsApresentação ruby + rails
Apresentação ruby + railsMarcelo Bohn
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Php, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJFPhp, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJFClaudson Oliveira
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objetoElaine Naomi
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...tdc-globalcode
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens PooInfogenius
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosGeorge Mendonça
 
Programação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em JavaProgramação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em JavaCristiano Almeida
 

Similaire à Active record (20)

Ruby
RubyRuby
Ruby
 
Introdução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyIntrodução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação Ruby
 
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
TechEd Brasil 2011: WEB 302 - Presente e futuro da linguagem de programação J...
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
Java primeiros-passos
Java primeiros-passosJava primeiros-passos
Java primeiros-passos
 
Introdução à Linguagem Ruby
Introdução à Linguagem RubyIntrodução à Linguagem Ruby
Introdução à Linguagem Ruby
 
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptTDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
 
Apresentação ruby + rails
Apresentação ruby + railsApresentação ruby + rails
Apresentação ruby + rails
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Php, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJFPhp, eu escolho você! @ UFJF
Php, eu escolho você! @ UFJF
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objeto
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Aula 14 - Funções: não duplique seu código
Aula 14 - Funções: não duplique seu códigoAula 14 - Funções: não duplique seu código
Aula 14 - Funções: não duplique seu código
 
Linguagens Poo
Linguagens PooLinguagens Poo
Linguagens Poo
 
PHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e ObjetosPHP 5.3 - Classes e Objetos
PHP 5.3 - Classes e Objetos
 
(2014-04-16) [Garoa HC] Strategy
(2014-04-16) [Garoa HC] Strategy(2014-04-16) [Garoa HC] Strategy
(2014-04-16) [Garoa HC] Strategy
 
Programação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em JavaProgramação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em Java
 

Active record

Notes de l'éditeur