2014-02-26 37 views
-1

爲什麼我不能這樣做?Rails使用查詢構建對象

def current_event 
    @current_event = Event.where(:start_date.lte => current_time, :end_date.gte => current_time).first 

    @current_event.days_left = days_left_function 
    return @current_event 
    end 

它返回一個「沒有方法」的錯誤......我得到。我試圖調用這個對象的方法?但我如何添加到對象像在rails中創建函數?

編輯

我真的很抱歉,但我已經讓你感到困惑,因爲我是如此的新手。

.days_left返回沒有方法錯誤...我只是想在我看來能夠撥打@current_event.days_left

因此,我正在定義@current_event,我想將days_left添加到該對象。

+0

你能告訴我們完整的錯誤?什麼方法導致No Method異常? –

+0

@meagar除非他使用特殊的查詢庫,如Squeel,否則我認爲你可能是對的。 –

+0

@carlosramireziii是的,可能的話,在這種情況下,應該在這裏另外添加一個標籤。這不是vanilla Rails語法。 – meagar

回答

1

我爲什麼能做到這一點呢?

因爲您已經發明瞭一種您想使用的語法,但是它並不基於任何形式的現實?你不能只編寫語法,並期望它們工作。

Scratch that:推測你正在使用Mongoid,這是我不熟悉的。如果是這種情況,錯誤可能不是因爲您在符號上調用.lte,而是因爲where返回了零結果,並且您在nil上調用days_left

在這種情況下,你沒有使用Mongoid,我原來的答覆代表:

要問其中一個領域是兩個值之間的記錄,使用範圍運算符:

Event.where(current_time: start_date..end_date) 

要問對於使用低於或大於或不等於,你需要建立自己的查詢,插值到它與?記錄:

Event.where('start_date <= ? and end_date >= ?', current_time, current_time). 
+0

謝謝...不需要是卑鄙的,但。我剛接觸rails,所以我發明的語法只是我試圖學習。 '.lte'和'.gte'確實可行,但範圍函數可能更好,請參閱我的編輯。 –

0

您應該檢查並確保查詢結果不爲零。如果Event.where(...)返回空關聯,則.first將返回nil。如果您嘗試在nil上撥打.days_left,您將收到一條錯誤消息。

爲防止發生這種情況,您應該執行nil檢查。像下面

@current_event = Event.where(:start_date.lte => current_time, :end_date.gte => current_time).first 
@current_event.days_left = days_left_function unless @current_event.nil?