Pergunta

O que eu quero fazer é muito simples, mas eu estou tentando encontrar o melhor ou mais elegante maneira de fazer isso. A aplicação Rails Estou construindo agora terá um cronograma de aulas diárias. Para cada classe os campos relevantes a esta questão são:

  • Dia da semana
  • Tempo de partida
  • Terminar tempo

A única entrada poderia ser algo como:

  • dia da semana: Quarta-feira
  • hora de início: 10h00
  • tempo final: meio-dia

Também devo mencionar que é um bi-lingual Rails 2.2 aplicativo e eu estou usando o i18n nativa característica trilhos. Na verdade, tenho várias perguntas.

Em relação ao dia da semana, devo criar uma tabela extra com lista de dias, ou há um built-in maneira de criar essa lista na mosca? Tenha em mente estes dias da semana terá que ser processado em Inglês ou Espanhol na vista cronograma dependendo da variável local.

Enquanto consultar o cronograma vou precisar para agrupar e ordenar os resultados por dia da semana, de segunda a domingo, e de modo claro as classes dentro de cada dia, iniciando tempo.

Com relação à hora de início e término do tempo de cada classe que você usaria de data e hora campos ou campos inteiros? Se o último como você implementar isso exatamente?

Olhando para a frente para ler os diferentes sugestões que vocês vão chegar a.

Foi útil?

Solução

Gostaria apenas de armazenar o dia da semana como um número inteiro. 0 => Segunda-feira ... 6 => Domingo (ou qualquer forma que desejar. Ie. 0 => domingo). Em seguida, armazenar a hora de início e de término como o tempo.

Isso faria agrupamento realmente fácil. Tudo que você tem a fazer é ordenar pelo dia da semana ea hora de início.

Você pode exibir esta de várias maneiras, mas aqui é o que eu faria.

  1. têm funções como: @sunday_classes = DailyClass.find_sunday_classes que retorna todas as classes para domingo Weaver hora de início. Em seguida, repita para cada dia.

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

    Nota:. Find_by provavelmente deve ter id no final mas isso é apenas uma preferência em como você deseja nomear a coluna

  2. Se você quiser a semana inteira em seguida, chamar todos os sete do controlador e laço trough-los na vista. Você pode até mesmo criar páginas de detalhes para cada dia.

  3. A tradução é a única parte complicada. Você pode criar uma função auxiliar que leva um inteiro e retorna o texto para o dia apropriado da semana com base no local.

Isso é muito básico. Nada complicado.

Outras dicas

Se os seus dados é um tempo, então eu iria guardar isso como um tempo - caso contrário, você sempre vai ter que convertê-lo para fora do banco de dados quando você faz operações de data e hora relacionado nele. O dia é de dados redundantes, pois será parte do objeto de tempo.

Isso deve significar que você não precisa armazenar uma lista de dias.

Se t é um tempo, então

t.strftime('%A')

sempre lhe dará o dia como uma string em Inglês. Este poderia então ser traduzido por i18n conforme necessário.

Então você só precisa armazenar o tempo de início e fim do tempo, ou o tempo de início e duração. Ambos devem ser equivalentes. Eu seria tentado a armazenar terminando tempo eu mesmo, no caso de você precisa fazer manipulações de dados sobre os tempos de término, que, portanto, não terão de ser calculado.

Eu acho que a maior parte do resto do que você descreve também deve cair de armazenar dados em tempo como instâncias de tempo.

Ordenação por semana dia e hora será apenas uma questão de ordenação por sua coluna tempo. i.

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

O agrupamento por dia é um pouco mais complicado. No entanto este é um excelente post sobre a forma de grupo por semana. O agrupamento por dia será análoga.

Se você está lidando com volumes não-triviais de dados, pode ser melhor fazê-lo no banco de dados, com um find_by_sql e que pode depender funcionalidade hora ea data do seu banco de dados, mas novamente armazenar os dados como um Time Will também ajudá-lo aqui. Por exemplo no PostgreSQL (que eu uso), ficando a semana de uma classe é

date_trunc('week', starting_time)

que você pode usar em uma cláusula Group By, ou como um valor para uso em alguma lógica loop no rails.

Re dias da semana, se você precisa de ter, por exemplo, classes que reúnem 09: 00-10: 00 em MWF, então você poderia usar uma tabela separada para dias uma classe se reúne (introduzidos por ambos ID classe e DOW) ou ser mal (ou seja, não normalizado) e manter o equivalente a um matriz de DOW em cada classe. O argumento clássico é o seguinte:

  • A mesa separada pode ser indexado em uma forma de apoiar um ou seleciona DOW-orientado, mas leva um pouco mais de cola para colocar a imagem inteira juntos para uma classe orientada a classe.
  • A matriz-de-DOW é mais simples de visualizar para programadores iniciantes e um pouco mais simples de código sobre, mas significa que o raciocínio sobre DOW requer olhar todas classes.

Se isto é apenas para o seu horário de aula pessoal, fazer o que você obtém o valor que você está procurando, e viver com as consequências; se você está tentando construir um sistema real para múltiplos usuários, eu iria com uma tabela separada. Todas essas regras de normalização estão lá por uma razão.

Quanto nomes DOW (legíveis), isso é uma questão-camada de apresentação, e não deveriam estar no núcleo do conceito DOW. (Suponha que você decidiu se mudar para Montreal, e precisava de francês? Isso deve ser outra "face" e não uma mudança para a implementação do núcleo.)

Como para iniciar / terminar vezes, mais uma vez a questão é suas necessidades. Se todas as classes começam e terminam na hora (X: 00) limites, você poderia certamente usar 0..23 como as horas do dia. Mas, então, sua vida seria miserável assim que você teve que acomodar esse seminário de 45 minutos. Como diz o velho comercial disse: "Pague-me agora ou pagar-me mais tarde."

Uma abordagem seria para definir o seu próprio conceito ClassTime e particionar todo o raciocínio sobre os tempos para essa classe. Poderia começar com uma representação simplista (horas integrais 0..23 ou minutos integrais após a meia-noite 0..1439) e, em seguida, "crescer", conforme necessário.

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