Frage

Ich möchte ein Ruby -Edelstein für mein Projekt finden, um mit Recuring -Ereignissen zu arbeiten, die den folgenden Anforderungen entsprechen:

  • Kann Muster wie "Weekly am Dienstag und Wednessday" oder "monatlich am letzten Dienstag" verarbeiten
  • kann das nächste Ereignis berechnen
  • Kann ein Muster in die String serialisieren/deserialisieren, um in der Datenbank zu speichern
  • Die Serialisierung hat ein stabiles Format (EI Es kann auch nach dem Upgrade geladen werden)
  • Arbeiten Sie zumindest mit den folgenden Musterkomponenten: Zeit, Tag der Woche, Monat des Monats, n -ter Woche der Woche im Monat;
  • kann täglich, wöchentlich, monatlich oder mit Intervall von n Tagen, Wochen oder Monaten wiederholen
  • Kann ein Muster in natürlicher englischer Sprache darstellen
  • kann ein Muster aus Englisch analysieren (optional)
  • Kann in ein beliebtes Format wie ICIC exportieren (optional)
  • Kann in andere Edelsteine/Systeme für Kalender und Aufgabenverwaltung integriert werden (optional)
  • Unterstützung des aktiven Datensatzes - Parameter -Analyse, Validierung (optional)
  • Hat genug Tests und wenige Fehler, mehr als 1 Benutzer :)
  • hat eine angemessene Leistung

Ich habe zwei relevante Kandidaten gefunden:

  • Tickle - das Gute ist, dass es Englisch analysieren kann.
  • ICE_CUBE (+Zeitplan -Attributes) - Das Gute ist, dass es am beliebtesten ist und in ICIC exportiert werden kann

Könnten Sie ein Juwel vorschlagen und damit positive und negative Erfahrungen beschreiben?

Vielleicht könnten Sie auch einige relevante Kriterien/Anforderungen hinzufügen, die ich nicht erwähnt habe.

Ps pease jemanden mit 1,5k+ fügen Sie recurring_events Tag hinzu. Vielen Dank

War es hilfreich?

Lösung

Ich benutze am Ende Eiswürfel aus den folgenden Gründen:

  • Am beliebtesten
  • kann das nächste Ereignis berechnen
  • Kann ein Muster in die String serialisieren/deserialisieren, um in der Datenbank zu speichern
  • Die Serialisierung hat ein stabiles Format (EI Es kann auch nach dem Upgrade geladen werden)
  • Arbeiten Sie zumindest mit den folgenden Musterkomponenten: Zeit, Tag der Woche, Monat des Monats, n -ter Woche der Woche im Monat;
  • kann täglich, wöchentlich, monatlich oder mit Intervall von n Tagen, Wochen oder Monaten wiederholen
  • kann ein Muster aus Englisch analysieren (optional)
  • Kann in ein beliebtes Format wie ICIC exportieren (optional)

Diese bei meinen Kriterien werden nicht damit erfüllt:

  • Kann ein Muster in natürlicher englischer Sprache darstellen
  • Unterstützung des aktiven Datensatzes - Parameter -Analyse, Validierung (optional)

Dieser wird nicht verifiziert:

  • hat eine angemessene Leistung

Das Erstellen von ICE_CUBE :: Zeitplan aus den Benutzereingaben in Rails ist nicht sehr überzeugend, aber machbar:

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

Andere Tipps

So schön wie ice_cube ist, Es erscheint nicht für eine große Planungsanwendungen geeignet, bei denen Sie möglicherweise über 100.000 Ereignisse verfügen, durch die Sie filtern müssen, um zu sehen, was an einem aktuellen Tag erscheint. Denken Sie an Meetup.com

Da alles in eine Regelzeichenfolge serialisiert ist, scheint die einzige Möglichkeit, eine Hauptliste zu filtern, so etwas wie diese:

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

Nicht sehr effizient. Jemand, bitte korrigiere mich !! Hoffentlich vermisse ich einen Trick?

Probieren Sie auch die obige Methode mit einem Datum, das 100 Jahre in der Zukunft beträgt ... es scheint, als würde ICE_CUBE die weiteren Abfrage vom aktuellen Datum verlangsamen.

Mir ist kein einzelnes Plugin bekannt, das alle Ihre Anforderungen erledigt, sondern die Kombination von Rufus-Scheduler und chronisch sollte dich ziemlich weit bringen.

Rufus Scheduler erledigt die Planung mit einem cron-ähnlichen Format, das auch lokale Zeitzonen berücksichtigt. Chronisch analysiert die natürliche Sprache. Das Zusammenstellen sollte die meisten Ihrer Bedürfnisse lösen.

Die Rufus -Dokumentation enthält einige Hinweise zum Paarung der beiden Lösungen.

Ich empfehle, einen Rubytoolbox zu sehen Wiederkehrende Ereignisse Edelsteine. Es sollte auf dem neuesten Stand sein und enthält ICE_CUBE, zuvor erwähnt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top