2013-03-06 70 views
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 

的問題是:

我要確保一個人僅在該間隔之間分配1個任務(start_dateend_date

例如,

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 => true而是某種unique_in_interval => true

我不能在數據庫級別添加索引

有人可以解釋如何做到這一點?

在此先感謝。

回答

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 

上述方法會給你所有的比賽條件比你可以刪除後一個的記錄。

1

使用任何鎖定機制像redis locker

RedisLocker.new("assign_task_#{@user.id}").run! do 
    @user.assign_task(@task) unless @user.has_task_within_time_period? 
end 
就鎖定操作