Monitore a tabela do banco de dados para alterações externas no aplicativo Rails
-
23-09-2019 - |
Pergunta
Estou integrando algumas tabelas de modelo não Rails em meu aplicativo Rails.Tudo funciona muito bem, a forma como configuro o modelo é:
class Change < ActiveRecord::Base
establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"])
set_table_name "change"
end
Dessa forma posso usar o Change
modelo para todos os registros existentes com find
etc.
Agora gostaria de executar algum tipo de notificação quando um registro for adicionado à tabela.Como o modelo nunca é criado via Change.new
e Change.save
usando ActiveRecord::Observer
não é uma opção.
Existe alguma maneira de executar parte do meu código Rails sempre que um novo registro for adicionado?eu olhei delayed_job
mas não consigo entender como configurar isso.Imagino que ele evolua em torno de um cron-job, que seleciona todas as linhas criadas desde a última execução do trabalho e depois chama o respectivo código Rails para cada linha.
Atualizar Atualmente olhando para Javan Em qualquer momento, parece que pode resolver o 'executar código Rails da parte cron'.
Solução 2
Isso é o que finalmente fiz: use Em qualquer momento, porque se integra bem ao Capistrano e me mostrou como executar o código do Rails de dentro de Cron. Minha paz desaparecida era basicamente
script/runner -e production 'ChangeObserver.recentchanges'
que agora é executado a cada 5 minutos. o recentchanges
lê o último id parecido de um arquivo tmp, puxa todos os novos Change
Os registros que têm um ID mais alto do que isso e executam o código de observador normal para cada registro (e salva o ID mais alto do TMP-File, é claro).
Outras dicas
Sim, você vai querer algum tipo de processador de tarefas de fundo (atrasado :: Job é um dos populares, ou você pode fingir o seu com a biblioteca daemon ou similar) ou para configurar um cronjob que é executado em algum tipo de programação . Se você quiser verificar com frequência (a cada minuto, digamos), eu recomendaria a rota atrasada :: Job, se for mais longo (a cada hora), um trabalho de Cron fará isso bem.
Seguindo a rota do DJ, você precisaria criar um trabalho que verifique se há novos registros, processe -os se houver algum e, em seguida, o trabalho, pois cada trabalho é marcado "concluído" quando terminar.
-Jon
Como de costume no monitoramento de mudanças de estado, existem duas abordagens:votação e notificação.Você parece ter escolhido seguir o caminho da votação por enquanto (tendo um trabalho de cron observar o estado do banco de dados regularmente e executar algum código se isso mudar), você pode fazer a mesma coisa usando um dos agendadores de trilhos, lá estão alguns por aí (o Google os encontrará facilmente, eles têm vários conjuntos de recursos, eu vou permitir que você escolha aquele que atenda à sua necessidade se você conseguir esse caminho)
Você também pode tentar seguir o caminho da notificação, dependendo do seu banco de dados.Alguns bancos de dados suportam gatilhos e execução de processos externos ou protocolos de notificação específicos.Neste caso você é notificado pelo próprio banco de dados que a tabela foi alterada.existem muitas dessas opções para vários DBMS em Obtendo eventos de um banco de dados