1

このシナリオで競合状態を解決する方法がわかりません。

アクティブなレコードで Rails 3.2.11 を使用しています

私はモデルを持っています:(ほんの一例)

class Task < ActiveRecord::Base
  belongs_to :person
  attr_accessible :start_date, :end_date, :person_id
end

class Person < ActiveRecord::Base
  has_many :tasks
end

問題は:

start_dateその間隔 (からend_date)の間に、1 人の人に 1 つのタスクのみが割り当てられるようにしたい

例えば、

Task | Person_id | start_date       | end_date
0      1           01-01-01 10:00     01-01-01 11:00
1      1           01-01-01 10:15     01-01-01 10:45  ## this should no be valid!!

Rails のバリデーションは競合状態のためにこれを防げないことを知っています。データベース レベルでインデックスを追加することはできませんunique => trueunique_in_interval => true

誰かがこれを達成する方法を説明できますか?

前もって感謝します。

4

2 に答える 2

2

アイデアを提供するために、after_createコールバックを使用して、その条件付き間隔中に挿入されたばかりのフィールドの一意性を確認してください。

したがって、タスクモデルでは、

attr_accessor :between_date

after_create :discard_insert


def discard_insert
    @same_records = Person.joins(:tasks).where(:tasks=> {:between_date => start_date..end_date})
end

上記の方法は、競合状態のすべてのレコードを提供し、後のレコードを削除できます。

于 2013-03-06T14:11:30.507 に答える
1

redis ロッカーなどのロック機構を使用して操作をロックするだけです

RedisLocker.new("assign_task_#{@user.id}").run! do
  @user.assign_task(@task) unless @user.has_task_within_time_period?
end
于 2013-08-15T03:10:57.273 に答える