2016-05-01 102 views
0

我創建了一個模型:講座(START_TIME,END_TIME,位置)。我想編寫驗證函數來檢查新講座的時間是否與數據庫中保存的講座重疊。這樣我才能發現這個位置是否被佔用。我的作用是:如何檢查時間重疊軌道

class Lecture < ActiveRecord::Base 

validates :title, :position, presence: true 

validates :start_time, :end_time, format: { with: /([01][0-9]|2[0-3]):([0-5][0-9])/, 
     message: "Incorrect time format" } 

validate: time_overlap 

def time_overlap 
    Lecture.all.each do |user| 
     if (user.start_time - end_time) * (start_time - user.end_time) >= 0      
     errors.add(:Base, "time overlaps") 
     end 
    end 
end 

end 

錯誤消息:NoMethodError在LecturesController#創建 未定義的方法` - 爲無@」:NilClass。如何以正確的格式編寫此功能?

+0

你提到你在控制器中出現錯誤,但仍然沒有添加控制器代碼? – Alfie

+0

您在'lectures_controller.rb'的'create'方法中有一個拼寫錯誤(順便說一下,您忽略了發佈)。除此之外,你的時間衝突的方法是低效的。與使用數據庫加載所有講座並在Ruby中進行比較,最好使用start_time new_lecture.end_time構造一個選擇講座的查詢。不要在應用程序代碼中執行數據庫可以爲你做的事情。 – MarsAtomic

+0

控制器工作正常,沒有time_overlap功能,我只是不明白什麼是「未定義的方法' - @」的零。在此之際NilClass」我想我的代碼在time_overlap有錯紅寶石風格希望能知道如何檢查是否。時間與正確的代碼重疊 – runchu

回答

1

看看紅寶石2.3.0的時間類:http://ruby-doc.org/core-2.3.0/Time.html

你可以用它來檢查,如果一個時間點之前或之後的另一個時間點,如:

t1 = Time.now 
t2 = Time.now 
t1 < t2 
=> true 
t1 > t2 
=> false 

所以,爲了檢查數據庫中現有演講是否存在給定時間,可以編寫一些Ruby來檢查擬議演講的開始時間或結束時間是否在任何現有講座的開始時間之後和結束時間之前。

+0

值得一提的是,雖然'<'通常足夠好,您還需要在比較之前驗證兩個值的「存在」。 – tadman