13

私のプロジェクトが次の要件に一致する定期的なイベントを処理するための ruby​​ gem を見つけたいと考えています。

  • 「毎週火曜日と水曜日」、「毎月最後の火曜日」などのパターンを処理できます。
  • 次の出現を計算できます
  • パターンを文字列にシリアライズ/デシリアライズしてデータベースに格納できます
  • シリアライゼーションは安定した形式です (アップグレード後もロードできます)
  • 少なくとも次のパターン コンポーネントで動作します: 時間、曜日、月の日付、月の n 番目の曜日。
  • 毎日、毎週、毎月、または n 日、週、または月の間隔で繰り返すことができます
  • 自然な英語でパターンを表現できる
  • 英語からパターンを解析できます (オプション)
  • iCal などの一般的な形式にエクスポートできます (オプション)
  • カレンダーとタスク管理のために他のgem/システムと統合できます(オプション)
  • Active Record のサポート - パラメータの解析、検証 (オプション)
  • 十分なテストがあり、バグはほとんどなく、1 人以上のユーザーがいます :)
  • 適度な性能がある

関連する候補が 2 つ見つかりました。

  • Tickle - 良い点は、英語を解析できることです。
  • Ice_Cube(+Schedule-Attributes) - 最も人気があり、iCal にエクスポートできるという利点があります。

宝石を提案して、その宝石のポジティブな経験とネガティブな経験を説明していただけますか?

また、言及していない関連する基準/要件を追加することもできます。

PS 1,5K+ recurring_events タグを追加した誰かをピーズしてください。ありがとう

4

4 に答える 4

8

次の理由でIce_Cubeを使用することになります。

  • 最も人気のある
  • 次の発生を計算できます
  • パターンを文字列にシリアル化/逆シリアル化してデータベースに保存できます
  • シリアル化の形式は安定しています(つまり、アップグレード後もロードできます)
  • 少なくとも次のパターンコンポーネントで動作します:時間、曜日、日付、月のn番目の曜日。
  • 毎日、毎週、毎月、またはn日、数週間、または数か月の間隔で繰り返すことができます
  • 英語からパターンを解析できます(オプション)
  • iCalなどの一般的な形式にエクスポートできます(オプション)

私の基準でのこれらはそれによって満たされていません:

  • 自然な英語でパターンを表すことができます
  • Active Recordのサポート-パラメーターの解析、検証(オプション)

これは検証されていません:

  • 適度なパフォーマンスを持っています

Railsでのユーザー入力からIce_Cube::Scheduleを作成するのはあまり便利ではありませんが、実行可能です。

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
于 2011-04-19T19:39:18.110 に答える
7

Ice_Cube は魅力的ですが、現在の日に何が表示されるかを確認するためにフィルター処理する必要がある 100,000 以上のイベントがある大規模なスケジューリング アプリケーションには適していないようです。meetup.com を考える

すべてがルール文字列にシリアル化されるため、メジャー リストをフィルタリングする唯一の方法は次のようになります。

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

あまり効率的ではありません。誰か訂正してください!! うまくいけば、私はトリックを逃していますか?

また、100 年先の Date を使用して上記の方法を試してください...現在の日付から離れてクエリを実行すると、ice_cube の速度が低下するように見えます。

于 2011-08-09T09:36:58.110 に答える
2

RubyToolbox のRecurring Events gem を参照することをお勧めします。これは最新である必要があり、前述の ice_cube が含まれています。

于 2012-03-27T03:51:38.507 に答える
2

あなたのすべての要件を処理する単一のプラグインを私は知りませんが、rufus-schedulerchronicを組み合わせることで、かなりのことができるはずです。

Rufus スケジューラは、ローカル タイムゾーンにも対応する cron のような形式を使用してスケジューリングを処理します。Chronic は自然言語の解析を行います。それらを組み合わせることで、ほとんどのニーズが解決されるはずです。

Rufus のドキュメントには、2 つのソリューションの組み合わせに関するいくつかの注意事項があります。

于 2011-03-15T16:10:57.577 に答える