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

Active record