Estou criando um aplicativo de calendário de grupo que precisa oferecer suporte a eventos recorrentes, mas todas as soluções que eu tenho para lidar com esses eventos parecem um hack. Posso limitar o quão à frente se pode olhar e depois gerar todos os eventos de uma só vez. Ou posso armazenar os eventos como repetidos e exibi-los dinamicamente quando se olha para a frente no calendário, mas terei que convertê-los em um evento normal se alguém quiser alterar os detalhes de uma instância específica do evento.
Tenho certeza de que há uma maneira melhor de fazer isso, mas ainda não a encontrei. Qual é a melhor maneira de modelar eventos recorrentes, onde você pode alterar detalhes ou excluir determinadas instâncias de eventos?
(Estou usando Ruby, mas não deixe que isso restrinja sua resposta. Se houver uma biblioteca específica para Ruby ou algo assim, é bom saber.)
fonte
Martin Fowler - Eventos recorrentes para calendários contém algumas idéias e padrões interessantes.
A gema Runt implementa esse padrão.
fonte
Pode haver muitos problemas com eventos recorrentes, deixe-me destacar alguns que eu conheço.
Solução 1 - sem instâncias
Armazene o compromisso original + os dados de recorrência, não armazene todas as instâncias.
Problemas:
Solução 2 - instâncias da loja
Armazene tudo de 1, mas também todas as instâncias, vinculadas ao compromisso original.
Problemas:
Obviamente, se você não for fazer exceções, qualquer uma das soluções deve ser boa e você basicamente escolhe um cenário de troca de tempo / espaço.
fonte
Desenvolvi vários aplicativos baseados em calendário e também criei um conjunto de componentes reutilizáveis de calendário JavaScript que oferecem suporte à recorrência. Eu escrevi uma visão geral de como projetar para recorrência que pode ser útil para alguém. Embora existam alguns bits específicos da biblioteca que escrevi, a grande maioria dos conselhos oferecidos é geral para qualquer implementação de calendário.
Alguns dos pontos principais:
É um tópico realmente complicado, com muitas abordagens válidas para implementá-lo. Eu direi que na verdade eu implementei a recorrência várias vezes com sucesso, e eu gostaria de receber conselhos sobre esse assunto de quem ainda não o fez.
fonte
Você pode examinar as implementações do software iCalendar ou o próprio padrão (
RFC 2445RFC 5545 ). Os que mais vêm à mente são os projetos Mozilla http://www.mozilla.org/projects/calendar/ Uma pesquisa rápida também revela http://icalendar.rubyforge.org/ .Outras opções podem ser consideradas, dependendo de como você armazenará os eventos. Você está construindo seu próprio esquema de banco de dados? Usando algo baseado no iCalendar etc.?
fonte
Estou trabalhando com o seguinte:
e uma gema em andamento que estende o formtastic com um tipo de entrada: recurring (
form.schedule :as => :recurring
), que renderiza uma interface semelhante ao iCal ebefore_filter
serializa a visualização em umIceCube
objeto novamente, gueto.Minha idéia é tornar incrivelmente fácil adicionar atributos recorrentes a um modelo e conectá-lo facilmente na visualização. Tudo em algumas linhas.
Então, o que isso me dá? Atributos indexados, editáveis e recorrentes.
events
lojas de uma única instância dia, e é usado na exibição de calendário / ajudante dizertask.schedule
armazena o yaml'dIceCube
objeto, de modo que você pode fazer chamadas como:task.schedule.next_suggestion
.Recapitulando: Eu uso dois modelos, um plano, para a exibição do calendário e um atributo para a funcionalidade.
fonte
Estou usando o esquema do banco de dados conforme descrito abaixo para armazenar os parâmetros de recorrência
http://github.com/bakineggs/recurring_events_for
Então eu uso o runt para calcular dinamicamente as datas.
https://github.com/mlipper/runt
fonte
Observe que, se você permitir regras de recorrência que não terminem, terá que pensar em como exibir sua quantidade agora infinita de informações.
Espero que ajude!
fonte
Eu recomendaria usar o poder da biblioteca de datas e a semântica do módulo range do ruby. Um evento recorrente é realmente um horário, um período (um começo e um fim) e geralmente um único dia da semana. Usando data e intervalo, você pode responder a qualquer pergunta:
Produz todos os dias do evento, incluindo o ano bissexto!
fonte
A partir dessas respostas, eu meio que selecionei uma solução. Eu realmente gosto da idéia do conceito de link. Eventos recorrentes podem ser uma lista vinculada, com a cauda conhecendo sua regra de recorrência. Alterar um evento seria fácil, pois os links permanecem no lugar e a exclusão de um evento também é fácil - basta desvincular um evento, excluí-lo e vincular novamente o evento antes e depois dele. Você ainda precisa consultar eventos recorrentes toda vez que alguém olha para um novo período nunca visto antes no calendário, mas, caso contrário, isso é bastante claro.
fonte
Você pode armazenar os eventos como repetidos e, se uma instância específica foi editada, crie um novo evento com o mesmo ID de evento. Em seguida, ao procurar o evento, procure todos os eventos com o mesmo ID de evento para obter todas as informações. Não tenho certeza se você rolou sua própria biblioteca de eventos ou se está usando uma existente, portanto, pode não ser possível.
fonte
Verifique o artigo abaixo para obter três boas bibliotecas de data / hora do ruby. ice_cube, em particular, parece uma escolha sólida para regras de recorrência e outras coisas que um calendário de eventos precisaria. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
fonte
Em javascript:
Como lidar com agendas recorrentes: http://bunkat.github.io/later/
Manipulação de eventos complexos e dependências entre esses agendamentos: http://bunkat.github.io/schedule/
Basicamente, você cria as regras e solicita à lib que calcule os próximos N eventos recorrentes (especificando um intervalo de datas ou não). As regras podem ser analisadas / serializadas para salvá-las em seu modelo.
Se você tiver um evento recorrente e desejar modificar apenas uma recorrência, poderá usar a função except () para descartar um dia específico e, em seguida, adicionar um novo evento modificado para esta entrada.
A lib suporta padrões muito complexos, fusos horários e até eventos de criação de cronogramas.
fonte
Armazene os eventos como repetidos e exiba-os dinamicamente, no entanto, permita que o evento recorrente contenha uma lista de eventos específicos que podem substituir as informações padrão em um dia específico.
Quando você consulta o evento recorrente, ele pode verificar uma substituição específica para esse dia.
Se um usuário fizer alterações, você poderá perguntar se ele deseja atualizar para todas as instâncias (detalhes padrão) ou apenas naquele dia (crie um novo evento específico e adicione-o à lista).
Se um usuário solicitar a exclusão de todas as recorrências deste evento, você também terá a lista de detalhes em mãos e poderá removê-los facilmente.
O único caso problemático seria se o usuário deseja atualizar este evento e todos os eventos futuros. Nesse caso, você terá que dividir o evento recorrente em dois. Nesse ponto, você pode considerar a possibilidade de vincular eventos recorrentes de alguma forma para poder excluí-los todos.
fonte
Para programadores .NET que estão preparados para pagar algumas taxas de licenciamento, o Aspose.Network pode ser útil ... inclui uma biblioteca compatível com o iCalendar para compromissos recorrentes.
fonte
Você armazena os eventos diretamente no formato iCalendar, o que permite repetições abertas, localização de fuso horário e assim por diante.
Você pode armazená-los em um servidor CalDAV e, quando desejar exibir os eventos, poderá usar a opção do relatório definido no CalDAV para solicitar ao servidor que faça a expansão dos eventos recorrentes no período visualizado.
Ou você pode armazená-los em um banco de dados e usar algum tipo de biblioteca de análise do iCalendar para fazer a expansão, sem a necessidade de PUT / GET / REPORT para conversar com um servidor CalDAV de back-end. Provavelmente é mais trabalhoso - tenho certeza que os servidores CalDAV ocultam a complexidade em algum lugar.
Ter os eventos no formato iCalendar provavelmente tornará as coisas mais simples a longo prazo, pois as pessoas sempre desejam que elas sejam exportadas para a instalação de outro software de qualquer maneira.
fonte
Simplesmente implementei esse recurso! A lógica é a seguinte: primeiro você precisa de duas tabelas. RuleTable armazena eventos paternos gerais ou de reciclagem. ItemTable são eventos de ciclo armazenados. Por exemplo, quando você cria um evento cíclico, o horário de início de 6 de novembro de 2015, o horário de término do dia 6 de dezembro (ou para sempre), ciclo por uma semana. Você insere dados em uma RuleTable, os campos são os seguintes:
Agora você deseja consultar os dados de 20 de novembro a 20 de dezembro. Você pode escrever uma função RecurringEventBE (início longo, fim longo), com base no horário de início e término, WeekLy, é possível calcular a coleção desejada, <cycleA11.20, cycleA 11.27, cycleA 12.4 ......>. Além de 6 de novembro, e o resto, eu o chamei de um evento virtual. Quando o usuário altera o nome de um evento virtual depois (cycleA11.27, por exemplo), você insere os dados em uma ItemTable. Os campos são os seguintes:
Na função RecurringEventBE (início longo, fim longo), você usa esses dados que abrangem o evento virtual (cycleB11.27), desculpe pelo meu inglês, tentei.
Este é o meu RecurringEventBE:
fonte
Posso sugerir que "nenhuma data final" possa ser resolvida até uma data final no final do século. Mesmo para um evento diário, a quantidade de espaço permanece barata.
fonte