[ruby] 캘린더 응용 프로그램에서 되풀이 이벤트를 모델링하는 가장 좋은 방법은 무엇입니까?

반복 일정을 지원해야하는 그룹 일정 응용 프로그램을 작성하고 있지만 이러한 일정을 처리하기 위해 제시 한 모든 솔루션은 해킹처럼 보입니다. 어느 정도 앞을 볼 수 있는지 제한 한 다음 모든 이벤트를 한 번에 생성 할 수 있습니다. 또는 일정을 반복으로 저장하고 캘린더에서 미리 볼 때 동적으로 표시 할 수 있지만 누군가가 특정 이벤트 인스턴스의 세부 정보를 변경하려면 일반 이벤트로 변환해야합니다.

더 좋은 방법이 있다고 확신하지만 아직 찾지 못했습니다. 특정 이벤트 인스턴스의 세부 사항을 변경하거나 삭제할 수있는 반복 이벤트를 모델링하는 가장 좋은 방법은 무엇입니까?

(루비를 사용하고 있지만 답을 제한하지 마십시오. 루비 전용 라이브러리 나 다른 것이 있다면 알아두면 좋습니다.)



답변

나는 미래의 모든 되풀이 이벤트에 대해 ‘링크’개념을 사용합니다. 달력에 동적으로 표시되고 단일 참조 객체로 다시 연결됩니다. 이벤트가 발생하면 링크가 끊어지고 이벤트가 독립형 인스턴스가됩니다. 되풀이 이벤트를 편집하려고하면 이후의 모든 항목 (예 : 단일 연결된 참조 변경)을 변경하거나 해당 인스턴스 만 변경하라는 메시지가 표시됩니다 (이 경우 독립형 인스턴스로 변환 한 다음 변경). 후자의 경우 단일 인스턴스로 변환 된 모든 향후 이벤트의 반복 목록을 추적해야하므로 약간 문제가 있습니다. 그러나 이것은 전적으로 가능합니다.

따라서 본질적으로 단일 인스턴스와 되풀이 이벤트라는 두 가지 클래스의 이벤트가 있습니다.


답변

Martin Fowler-달력의 되풀이 이벤트 에는 흥미로운 통찰력과 패턴이 포함되어 있습니다.

Runt gem은이 패턴을 구현합니다.


답변

반복되는 이벤트에는 많은 문제가있을 수 있습니다. 제가 알고있는 몇 가지를 강조하겠습니다.

해결 방법 1-인스턴스 없음

원래 약속 + 되풀이 데이터를 저장하고 모든 인스턴스를 저장하지는 마십시오.

문제 :

  • 필요할 때 날짜 창에서 모든 인스턴스를 계산해야합니다.
  • 예외를 처리 할 수 ​​없습니다 (예 : 인스턴스 중 하나를 삭제하거나 이동하거나이 솔루션으로는이를 수행 할 수 없음)

솔루션 2-인스턴스 저장

원래 약속에 다시 연결된 1부터 모든 인스턴스를 모두 저장합니다.

문제 :

  • 많은 공간을 차지합니다 (그러나 공간은 저렴하므로 아주 작습니다)
  • 예외를 처리 한 후 원래 약속을 되돌아 가서 편집하는 경우 예외를 정상적으로 처리해야합니다. 예를 들어, 세 번째 인스턴스를 하루 앞으로 이동하면 원래 약속 시간으로 돌아가서 원래 날짜의 시간을 다시 삽입하고 이동 한 날짜를 그대로두면 어떻게됩니까? 이동 한 링크를 해제 하시겠습니까? 이동 한 것을 적절히 변경하려고합니까?

물론, 예외를하지 않는다면, 어느 쪽의 솔루션이든 괜찮을 것이며 기본적으로 시간 / 공간 상충 관계 시나리오에서 선택합니다.


답변

여러 달력 기반 응용 프로그램을 개발했으며 반복을 지원하는 재사용 가능한 JavaScript 달력 구성 요소 집합도 작성했습니다. 누군가에게 도움이 될 수있는 재발을 디자인하는 방법에 대한 개요를 작성했습니다 . 내가 작성한 라이브러리에 특정한 몇 가지 비트가 있지만 제공되는 조언의 대부분은 모든 캘린더 구현에 일반적입니다.

핵심 포인트 중 일부 :

  • iCal RRULE 형식을 사용하여 되풀이를 저장하십시오 -그것은 정말로 재발 명하고 싶지 않은 바퀴입니다
  • 개별 반복 이벤트 인스턴스 를 데이터베이스에 행으로 저장하지 마십시오 ! 항상 반복 패턴을 저장하십시오.
  • 이벤트 / 예외 스키마를 설계하는 방법에는 여러 가지가 있지만 기본적인 시작점 예제가 제공됩니다.
  • 모든 날짜 / 시간 값은 UTC로 저장하고 표시하기 위해 로컬로 변환해야합니다
  • 되풀이 이벤트에 대해 저장된 종료 날짜는 항상 되풀이 범위종료 날짜 (또는 되풀이되는 “영구”인 경우 플랫폼의 “최대 날짜”) 여야하며 이벤트 기간은 별도로 저장해야합니다. 이것은 나중에 이벤트를 깔끔하게 쿼리하는 방법입니다.
  • 이벤트 인스턴스 생성 및 반복 편집 전략에 대한 일부 토론이 포함되어 있습니다.

구현에 대한 많은 유효한 접근 방식이있는 정말 복잡한 주제입니다. 나는 실제로 반복을 여러 번 성공적으로 구현했다고 말하고 실제로 그것을하지 않은 사람 으로부터이 주제에 대해 조언을하는 것에 경계 할 것입니다.


답변

iCalendar 소프트웨어 구현 또는 표준 자체 ( RFC 2445 RFC 5545 ) 를보고 싶을 수 있습니다 . 모질라 프로젝트는 http://www.mozilla.org/projects/calendar/ 에서 빠르게 기억할 수 있습니다. 빠른 검색 에서도 http://icalendar.rubyforge.org/ 가 드러납니다 .

이벤트를 저장하는 방법에 따라 다른 옵션을 고려할 수 있습니다. 자신 만의 데이터베이스 스키마를 구축하고 있습니까? iCalendar 기반 등을 사용하십니까?


답변

나는 다음과 같이 일하고있다 :

form.schedule :as => :recurringiCal과 같은 인터페이스를 렌더링 before_filter하고 뷰를 IceCube다시 객체 로 직렬화 하는 입력 유형 : recurring ( )으로 형식을 확장하는 gem이 진행 중입니다 .

내 생각은 반복 속성을 모델에 쉽게 추가하고보기에서 쉽게 연결할 수 있도록하는 것입니다. 두 줄에 모두 있습니다.


그래서 이것은 무엇을 제공합니까? 인덱싱되고 편집 가능한 반복 속성입니다.

events하루 인스턴스를 저장하고 달력보기 / 도우미 task.schedule에서 yaml’d IceCube객체를 저장 한다고 사용 되므로 다음과 같은 호출을 수행 할 수 있습니다 task.schedule.next_suggestion.

요약 : 달력 표시에는 하나, 평면에는 하나, 기능에는 하나는 두 가지 모델을 사용합니다.


답변

아래 설명대로 데이터베이스 스키마를 사용하여 반복 매개 변수를 저장하고 있습니다.

http://github.com/bakineggs/recurring_events_for

그런 다음 runt를 사용하여 날짜를 동적으로 계산합니다.

https://github.com/mlipper/runt