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'.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top