Skip to content

Instantly share code, notes, and snippets.

@rannyeribaptist
Created September 6, 2021 14:25
Show Gist options
  • Save rannyeribaptist/f00e2a56ca27c0ec46262203b7a1e454 to your computer and use it in GitHub Desktop.
Save rannyeribaptist/f00e2a56ca27c0ec46262203b7a1e454 to your computer and use it in GitHub Desktop.
module Policy
# A classe abaixo herda de ApplicationRecord.
#
# Sempre que eu chamar GracePeriod.find(id), ele vai buscar na tabela
# do banco de dados policy_grace_period.
#
# Eu preciso que essa classe seja volátio pra criar compatibilidade com dados antigos
# presentes no meu banco de dados, pois essa classe antigamente herdava de outra classe, chamada Endorsement.
#
# Então sempre que você buscava por um GracePeriod, ele pegava um registro da tabela policy_endorsements.
#
# O que preciso fazer é:
# sempre que alguém buscar por GracePeriod.find(15), ele vai pegar o dado no banco, vai verificar o type do registro,
# e se o type for "GracePeriod::Endorsement", significa que o registro é antigo e veio da tabela policy_endorsements.
# sendo assim, eu iria definir a classe abaixo como:
# class GracePeriod < Policy::Endorsement
# em todos os outros cenários (incluindo novos registros), ele ficaria exatamente como está:
# class GracePeriod < ApplicationRecord
#
# Então a pergunta é: é possível fazer essa verificação dentro do module (antes de definir a classe)?
# seria possível de alguma forma puxar a informação do banco, antes da classe ser montada? Algo do tipo:
#
# if Object.inspect.type.eql? 'Policy::Endorsement'
# class GracePeriod < Policy::Endorsement
# else
# class GracePeriod < ApplicationRecord
# end
class GracePeriod < ApplicationRecord
end
end
@drnluz
Copy link

drnluz commented Sep 6, 2021

se eu entendi bem, você tem duas tabelas, uma com dados "legados" e a outra com os novos dados, certo? Neste caso é melhor definir dois models, um para cada tabela e no find do GracePeriod tentar buscar na tabela antiga primeiro:

module Policy
  class LegacyGracePeriod < ApplicationRecord
    self.table_name = 'policy_endorsements'
  end
end

module Policy
  class GracePeriod < ApplicationRecord
    def find(id)
      LegacyGracePeriod.find_by(id) || super(id)
    end
  end
end

@rannyeribaptist
Copy link
Author

Essa era de fato uma das possibilidades que eu tinha pra solucionar esse problema. E nesse caso acho que vou nele mesmo :)
Valeuzão <3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment