Ruby on Rails: как моделировать повторяющиеся времена (еженедельные занятия)? - PullRequest
1 голос
/ 17 июня 2011

В моем приложении на Ruby on Rails у меня есть "групповая" модель, которая еженедельно повторяет "действия". Некоторые действия происходят только один день в неделю (пятница в 18:00), в то время как другие происходят несколько раз в неделю (понедельник-пятница в 8:00 или вторник / четверг в 10:00).

У меня возникли проблемы при попытке выяснить, как моделировать эти данные и как использовать Rails для создания формы для создания / обновления данных. Создать таблицу «Деятельности» с полем даты и времени? Или я делю день недели и время дня на два отдельных поля? А как насчет действий, которые происходят несколько раз в неделю?

Любые идеи или советы будут оценены. Кроме того, я был бы признателен, если бы вы знали о Драгоценном камне, который помогает с этим, поэтому мне не нужно заново изобретать колесо.

Обновление:

Например, если мне нужно отобразить что-то вроде этого:

Специальная деятельность группы А

  • Понедельник в 22:00 - Футбол
  • вт / четверг в 8:00 - теннис

Специальная деятельность группы B

  • с понедельника по пятницу в 12:00 - обед
  • Суббота в 8 утра - Завтрак
  • Воскресенье в 6 вечера - Ужин

Какие шаги мне нужно предпринять, чтобы смоделировать и отобразить эти данные, используя Ruby on Rails?

Ответы [ 4 ]

2 голосов
/ 07 июля 2011

Модель group.rb

class Group < ActiveRecord::Base
  validates_presence_of :name
  has_many :activities, :through => :group_activity
end

activity.rb
class Activity < ActiveRecord::Base
  validates_presence_of :name
  belongs_to :group
  has_many :occurances, :through => :activity_occurance
end

occurance.rb
class Activity < ActiveRecord::Base
  validates_presence_of :date
  belongs_to :activity
end

Миграции (отдельно или все вместе) add_everything.rb

class AddEverything < ActiveRecord::Migration
  def self.up
    create_table :groups, :force => true do |t|
      t.string  :name
      t.timestamps
    end
    create_table :group_activity, :force => true do |t|
      t.integer  :group_id, :activity_id
      t.timestamps
    end
    create_table :activities, :force => true do |t|
      t.string  :name
      t.timestamps
    end
    create_table :activity_occurance, :force => true do |t|
      t.integer  :activity_id, :occurance_id
      t.timestamps
    end
    create_table :occurance, :force => true do |t|
      t.datetime  :date
      t.timestamps
    end
  end

  def self.down
    drop_table :groups
    drop_table :activities
    drop_table :occurances
    drop_table :group_activity
    drop_table :activity_occurance
  end
end

Это заботится о вашей модели работы. В вашем представлении групп _form я бы добавил имя вашей связанной группы и fields_for для имени вашей деятельности и fields_for occurance. В вашем случае используйте этот удобный инструмент выбора даты и времени jQuery, который является расширением поля выбора даты jQuery, чтобы заполнить поле своего события:

http://puna.net.nz/timepicker.htm

У вас также должны быть отдельные представления для управления действиями отдельно с соответствующей формой. На вашей странице показа отображение других полей довольно стандартно, но для случаев вы можете иметь что-то вроде (синтаксис haml):

= @group.name
- for activity in @group.activities
  = activity.name
  - for occurance in activity.occurances
    = occurance.date.strftime("%A at %r")

Надеюсь, это хотя бы поможет вам начать. Вы можете добавить дополнительную логику для проверки Activity.occurances.size для форматирования соответственно, если вы хотите отобразить что-то day1 / day2 / day3

1 голос
/ 17 июня 2011

https://github.com/jimweirich/texp Библиотека временных выражений Джима Вейриха - отличный ресурс для запросов такого рода вещей в ruby.

Если вам не нужно запрашивать этот набор, кроме просмотра всех из нихв пакетном режиме, тогда просто сериализация этой структуры данных, вероятно, будет работать для вас.

Но, в конце концов, вы, вероятно, просто будете использовать has_many :occurances, где вхождения начинаются как пары homebaked-recurrence-pattern-date_time и повторяются оттудав зависимости от того, какой набор функций вам нужен.

0 голосов
/ 17 июня 2011

Таким же образом, группа может иметь несколько действий, я думаю, что действие может иметь несколько событий. Я бы посоветовал попытаться смоделировать вашу базу данных таким образом, используя таблицу вероятностей.

Что касается формы, как насчет формы "master - detail" с активностью в качестве мастера и вхождением в качестве детали?

0 голосов
/ 17 июня 2011

Если вы считаете это правильным, у вас есть множество возможностей для представления и сохранения различных форматов даты и времени и интервалов в базе данных, также вы, вероятно, собираетесь изменить это, чтобы добавить некоторые параметры пользователям или удалитьпараметры в соответствии с ростом вашего сайта.

Я бы пошел с созданием двух полей, таких как «date_start» и «date_end», и одно строковое поле, содержащее код, который представляет частоту.Что-то около 3 символов на код, вначале M может быть ежемесячно, W еженедельно;второй может быть F для первого, L для последнего;третий символ может быть числом для определенного номера недели, F для пятницы.

Суть в том, что вы можете (кодировать и) декодировать это программно, поэтому, если вы добавите функции, вам не придется воссоздавать ваши связи с базой данных.

...