0

やや特殊な状況かもしれません。そして、PHP/MySQLでそれを行う方法をちょっと知っています。しかし、次のシナリオを実行するためのより高速な方法があるかどうか疑問に思っていました:

ユーザーには、開始日と終了日のアクティビティがあります。(たとえば、アクティビティは 12-10-2013 12:00:00 に開始し、12-10-2013 12:15:00 に終了します。)

ユーザーが新しいアクティビティを作成するたび。ユーザーが参加しているすべてのアクティビティ (user has_many: activities) を確認し、新しいアクティビティに指定された日付と交差する日付がないかどうかを確認します。

私はRailsにかなり慣れていないので、日付の比較などの検索をどこから始めるべきか本当にわかりません...

前もって感謝します

4

3 に答える 3

0

この 3 種類の交差がすべて発生しないことを確認する必要があります。

  • 私たちの活動は別の活動の中で起こってはなりません
  • 私たちの活動は、別の活動が終了する前に開始してはなりません
  • 私たちの活動は、別の活動が始まった後に終わってはなりません

次のようなものを使用してそれを行うことができます。

class Activity < ActiveRecord::Base

  validate :must_not_be_intersected

  def intersected?
    params = {
      :start => start_date,
      :end => end_date
    }

    Activity::where('start_date <= :start AND end_date >= :end', params)
      .where('(start_date >= :start AND start_date <= :end) OR (end_date >= :start AND end_date <= :end)', params)
      .exists?
  end

private

  def must_not_be_intersected
    errors.add :base, 'Other task running on the same period' if intersected?
  end

end
于 2014-03-24T18:15:37.343 に答える