문제

내가하고 싶은 것은 매우 간단하지만이 작업을 수행하는 가장 좋거나 가장 우아한 방법을 찾으려고 노력하고 있습니다. 내가 지금 건축하고있는 Rails 응용 프로그램에는 일일 수업 일정이 있습니다. 각 수업에 대해이 질문과 관련된 필드는 다음과 같습니다.

  • 요일
  • 시작 시간
  • 결말 시간

단일 항목은 다음과 같은 것일 수 있습니다.

  • 요일 : 수요일
  • 시작 시간 : 오전 10시
  • 결말 시간 : 정오

또한 이중 언어 레일 2.2 앱이며 기본 i18N 레일 기능을 사용하고 있다고 언급해야합니다. 실제로 몇 가지 질문이 있습니다.

요일에 관해서는 일 목록이있는 추가 테이블을 만들어야합니까, 아니면 해당 목록을 즉석에서 만들 수있는 내장 방법이 있습니까? 요즘 요즘에는 로케일 변수에 따라 일정보기에서 영어 또는 스페인어로 렌더링해야합니다.

일정을 쿼리하는 동안 나는 월요일부터 일요일까지 평일까지 결과를 그룹화하고 주문해야하며, 매일 시작 시간으로 매일 수업을 주문해야합니다.

각 수업의 시작 시간과 종료 시간과 관련하여 DateTime 필드 또는 정수 필드를 사용합니까? 후자가 어떻게 이것을 정확히 구현 하시겠습니까?

여러분이 생각해 낼 다른 제안을 읽기를 기대합니다.

도움이 되었습니까?

해결책

나는 그 요일을 정수로 보관할 것입니다. 0 => 월요일 ... 6 => 일요일 (또는 원하는 방식으로. 즉 0 => 일요일). 그런 다음 시작 시간과 종료 시간을 시간으로 저장하십시오.

그것은 그룹화를 정말 쉽게 만들 것입니다. 당신이해야 할 일은 요일과 시작 시간에 따라 분류됩니다.

당신은 이것을 여러 가지 방법으로 표시 할 수 있지만 여기에 내가 할 일이 있습니다.

  1. 다음과 같은 기능이 있습니다. @sunday_classes = DailyClass.find_sunday_classes 그것은 시작 시간별로 정렬 된 일요일의 모든 수업을 반환합니다. 그런 다음 매일 반복하십시오.

    def find_sunday_classes
      find_by_day_of_week(1, :order -> 'start_time')
    end

    참고 : find_by는 아마도 마지막에 ID가 있어야하지만 열의 이름을 지정하는 방법에 대한 선호도 일 것입니다.

  2. 일주일 내내 원한다면 컨트롤러에서 7 개를 모두 전화하고 시야에서 루프 트로프하십시오. 매일 세부 페이지를 만들 수도 있습니다.

  3. 번역은 유일한 까다로운 부분입니다. 정수를 취하고 로컬을 기준으로 적절한 요일에 텍스트를 반환하는 도우미 기능을 만들 수 있습니다.

그것은 매우 기본입니다. 복잡한 것은 없습니다.

다른 팁

귀하의 데이터가 시간이면 시간으로 저장합니다. 그렇지 않으면 날짜 및 시간 관련 작업을 수행 할 때 항상 데이터베이스에서 변환해야합니다. 하루는 시간 개체의 일부가되므로 중복 데이터입니다.

이것은 일 목록을 저장할 필요가 없다는 것을 의미해야합니다.

T가 시간이라면

t.strftime('%A')

항상 당신에게 하루를 영어로 끈으로 줄 것입니다. 그런 다음 필요에 따라 i18n에 의해 번역 될 수 있습니다.

따라서 시작 시간과 종료 시간, 시작 시간과 지속 시간 만 저장하면됩니다. 둘 다 동등해야합니다. 결말 시간을 직접 저장하려는 유혹을받을 것입니다. 결말 시간에 데이터 조작을 수행 해야하는 경우 계산할 필요가 없습니다.

나는 당신이 설명하는 나머지 대부분의 사람들이 시간의 사례로 시간 데이터를 저장하지 않아야한다고 생각합니다.

일주일마다 주문하는 것은 시간 칼럼에 따라 주문의 문제입니다. 즉

daily_class.find(:all, :conditions => ['whatever'], :order => :starting_time)

하루별 그룹화입니다 조금 더 까다 롭습니다. 하지만 이것은 훌륭한 게시물입니다 매주 그룹화하는 방법. 하루별 그룹화는 유사합니다.

사소한 양의 데이터를 다루는 경우 데이터베이스에서 데이터를 수행하는 것이 좋습니다. find_by_sql 데이터베이스의 시간 및 날짜 기능에 따라 다를 수 있지만 시간으로 데이터를 다시 저장하면 여기에서 도움이됩니다. 예를 들어 Postgresql (내가 사용하는)에서 수업의 주를받는 것은 다음과 같습니다.

date_trunc('week', starting_time)

이 그룹에서 절을 통해 사용할 수 있거나 레일의 일부 루프 로직에서 사용할 값으로 사용할 수 있습니다.

주일에 MWF에서 09 : 00-10 : 00을 만나는 클래스가 필요하다면, 클래스가 만나는 날 (클래스 ID와 다우로 키)에 별도의 테이블을 사용할 수 있습니다. 악 (예 : 정상화되지 않은) 및 각 클래스에서 다우 배열과 동등한 상태를 유지하십시오. 고전적인 주장은 이것입니다.

  • 별도의 테이블은 클래스 지향 또는 다우 지향 선택을 지원하는 방법으로 색인화 될 수 있지만 전체 그림을 클래스에 맞추기 위해 약간 더 접착제가 필요합니다.
  • Dow-of-Dow는 시작 프로그래머를 위해 시각화하기가 더 간단하고 코드에 대해 약간 더 간단하지만 Dow에 대한 추론은 보는 것이 필요하다는 것을 의미합니다. 모두 클래스.

이것이 개인 수업 일정에만 해당되는 경우, 원하는 가치를 얻고 결과를 얻으십시오. 여러 사용자를위한 실제 시스템을 구축하려고한다면 별도의 테이블을 가지고 갈 것입니다. 이러한 모든 정규화 규칙은 이유가 있습니다.

(사람이 읽을 수있는) 다우 이름까지는 프레젠테이션 레이어 문제이며 Dow의 핵심 개념에 있어서는 안됩니다. (몬트리올로 이사하기로 결정했고 프랑스어가 필요하다고 가정 해 봅시다. 그것은 또 다른 "얼굴"이어야하며 핵심 구현의 변화가 아니라.)

시작/종료 시간에 관해서는 다시 문제가 요구 사항입니다. 모든 클래스가 시간 (x : 00) 경계에 시작되면 하루의 시간으로 0..23을 사용할 수 있습니다. 그러나 45 분 세미나를 수용해야하자마자 당신의 인생은 비참 할 것입니다. 오래된 광고가 말했듯이, "지금 지불하거나 나중에 지불하십시오."

한 가지 방법은 자신의 클라스 타임 개념을 정의하고 해당 클래스에 시간에 대한 모든 추론을 분할하는 것입니다. 단순한 표현으로 시작할 수 있으며 (정착 시간 0..23 또는 자정 이후의 필수 시간 0.1439 이후의 필수 분)는 필요에 따라 "성장"할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top