Ruby: Опыт работы с драгоценными камнями для повторяющихся событий календаря?

Я хочу найти рубиновый жемчуг для моего проекта для работы с повторными событиями, которые соответствуют следующим требованиям:

  • может обрабатывать такие шаблоны, как "Еженедельно во вторник и Wednessday", или "Ежемесячно в последний вторник".
  • может вычислить следующее происшествие
  • может сериализовать/десериализовать шаблон в строку для хранения в базе данных
  • Сериализация имеет стабильный формат (например, он сможет загружаться даже после обновления)
  • работают по крайней мере со следующими компонентами шаблона: Время, День недели, Дата месяца, n-й день недели в месяце;
  • может повторяться ежедневно, еженедельно, ежемесячно или с интервалом в n дней, недель или месяцев.
  • может представлять шаблон на естественном английском языке.
  • может анализировать образец с английского (необязательно)
  • может экспортировать в какой-то популярный формат, например iCal (необязательно)
  • может интегрироваться с другими драгоценными камнями/системами для управления календарем и задачами (необязательно)
  • поддержка Active Record - синтаксический анализ параметров, проверка (необязательно)
  • имеет достаточно тестов и несколько ошибок, более 1 пользователь:)
  • имеет разумную производительность

Я нашел двух подходящих кандидатов:

  • Tickle - хорошо, что он может разбирать английский.
  • Ice_Cube (+ Schedule-Attributes) - хорошо, что он наиболее популярен и может экспортировать в iCal

Не могли бы вы предложить драгоценный камень и описать с ним положительные и отрицательные переживания?

Возможно, вы также можете добавить некоторые соответствующие критерии/требования, о которых я не упоминал.

P.S. Выровняйте кого-нибудь с тегом 1,5K + add recurring_events. Благодаря

Ответы

Ответ 1

В итоге я использую Ice_Cube по следующим причинам:

  • Самые популярные
  • может вычислить следующее происшествие
  • может сериализовать/десериализовать шаблон в строку для хранения в базе данных
  • Сериализация имеет стабильный формат (например, он сможет загружаться даже после обновления)
  • работают по крайней мере со следующими компонентами шаблона: Время, День недели, Дата месяца, n-й день недели в месяце;
  • может повторяться ежедневно, еженедельно, ежемесячно или с интервалом в n дней, недель или месяцев.
  • может анализировать образец с английского (необязательно)
  • может экспортировать в какой-то популярный формат, например iCal (необязательно)

Эти критерии по моим критериям не заполняются им:

  • может представлять шаблон на естественном английском языке.
  • поддержка Active Record - синтаксический анализ параметров, проверка (необязательно)

Это не проверено:

  • имеет разумную производительность

Создание Ice_Cube:: Расписание с пользовательского ввода в Rails не очень удобно, но выполнимо:

class EntryForm < FormModel

  include IceCube
  class_eval &ValidatesTimelinessSupport[{:start_date => :datetime}]

  Units = [Day = 'day', Week = 'week']
  Intervals = %w[0 1 2 3 4 5 6 7 8 9]
  Week_Days = [:sunday, :monday, :tuesday, :wednesday, :thursday, :friday, :saturday]

  Days_With_Letters = Week_Days.zip(%w[S M T W T F S])

  attr_accessible_accessors :interval, :unit, :start_date
  attr_accessible_accessors *Week_Days

  def_delegators :@model, :display_title, :schedule_yaml, :schedule_yaml=

  validates_date :start_date, :allow_blank => true
  validates_inclusion_of :unit, :in => Units
  validates_inclusion_of :interval, :in => Intervals
  validates_inclusion_of :complete, :in => %w[0 1], :allow_blank => true
  Week_Days.each { |day| validates_inclusion_of day, :in => %w[0 1], :allow_blank => true }

  before_edit {
    if not schedule_yaml.blank? and hash = YAML::load(schedule_yaml)
      schedule = Schedule.from_hash(hash)
    end

    if schedule and rule = schedule.rrules.first
      @start_date = schedule.start_date

      rule_hash = rule.to_hash
      @interval = rule_hash[:interval]

      case rule
      when DailyRule
        @unit = Day
      when WeeklyRule
        @unit = Week
        rule_hash[:validations][:day].try :each do |day_index|
          send "#{Week_Days[day_index]}=", 1
        end
      end

    else
      @start_date = Date.today
      @interval = 1
      @unit = Day
    end
  }

  before_save {
      sd = @start_date.blank? ?
          Date.today.to_all_day :
          @start_date.parse_date_in_timezone
      i = @interval.to_i
      schedule = Schedule.new(sd)


      rule = case @unit
        when Day
          Rule.daily i
        when Week
          Rule.weekly(i).day(
            *Week_Days.
            select { |day| send(day).to_i == 1 } )
      end

      schedule.add_recurrence_rule(rule)

      self.schedule_yaml = schedule.to_yaml
    end
  }
end

Ответ 2

Как прекрасно, как Ice_Cube, , он не подходит для приложений с большим масштабом планирования, где у вас может быть 100 000 + событий, которые необходимо фильтровать, чтобы увидеть, что появляется в текущий день. Think meetup.com

Поскольку все это сериализовано в строку правила, единственный способ фильтрации основного списка выглядит примерно так:

def self.entries_on(date)
    entries = TimetableEntry.all
    entries.reject{|te|!te.schedule.occurs_on?(date)}
end

Не очень эффективно. Кто-то ПОЖАЛУЙСТА, ПРАВИЛЬНО МЕНЯ!! надеюсь, мне не хватает трюка?

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

Ответ 3

Я не знаю ни одного плагина, который обрабатывает все ваши требования, но сочетание rufus-scheduler и chronic должно быть довольно далеко.

Планировщик Rufus обрабатывает планирование с использованием cron-подобного формата, который также поддерживает локальные часовые пояса. Хронический обрабатывает естественный язык. Объединение их должно решить большинство ваших потребностей.

В документации Rufus есть несколько замечаний по объединению двух решений.

Ответ 4

Я рекомендую взглянуть на RubyToolbox Повторяющиеся события. Он должен быть обновлен и включает ice_cube, упомянутый ранее.