1

私はイベントカレンダーを開発しています。このカレンダーでは、1時間ごとに、ユーザーが1つの予定に署名できるスロットがあります。

ユーザーがスロットを更新できる(また日付/時刻を変更できる)機能があるので、値を更新する前に、スロットが空いていることを確認するためにいくつかのチェックを実行したいと思います。だから私はこのような方法で終わった:

if Event.find(:all, :conditions => ["start_at = ? AND event_calendar_id = ?", self.start_at, self.id])
  errors.add :base, "You cannot save this appointment in that slot."
  return false
end

ちなみに、日時フィールドを変更せずに他のフィールドを更新すると、それ自体が検出されて例外が発生し、更新できなくなるため、問題が発生します。

現在のIDなどのデータベースデータにアクセスして値から自分自身を除外したり、送信された日時フィールドがデータベースのフィールドと等しいかどうかを確認したりする方法はありますか(このチェックをスキップできます)。

これを行うための最良の方法は何ですか?ありがとう。

PS私はレール3.2.3を使用しています

4

1 に答える 1

0

結果から除外するには、除外するIDselfに条件を追加するだけです。whereまた、 を呼び出すことでメモリとプロセッサ時間を節約できexists?ます。これは、行全体をフェッチして新しいオブジェクトを構築する代わりに、true または false を返すだけです。

Event.where( :start_at => start_at,
             :event_calendar_id => event_calendar.id ).
      where( "id <> ?", id ).
      exists?
于 2012-05-24T08:26:49.377 に答える