2012-09-23 28 views
0

我想在一個範圍內使用DateTime.parse將字符串轉換爲時間,但是,我收到了一個未定義的局部變量錯誤。Rails範圍內的DateTime.parse

是否有可能轉換範圍內的字段或我需要嘗試其他的東西嗎?

我的範圍:

scope :time_range, lambda { 
    a = DateTime.parse(start_time_am) 
    where("#{a} <= ?", Time.now.strftime('%H')) 
    } 

- 更新 -

與此打過左右,我發現我也許應該覆蓋默認訪問。我現在有以下幾點:

def start_time_am 
    read_attribute(:start_time_am).strftime("%H%M").to_i 
    end 

在控制檯中,我start_time_am場現在看起來像:

Promotion.last.start_time_am 
    => 430 

但是,如果我想定義一個新的領域暫時所以我仍然可以使用最初的一。

我可以在控制檯中訪問它,但不能在搜索時訪問。例如。

def start_time_new 
    read_attribute(:start_time_am).strftime("%H%M").to_i 
    end 

    def self.time_range 
    time = Time.now.strftime('%H%M').to_i 
    where("start_time_new <= ?", time) 
    end 

給出未知列錯誤。我認爲attr_reader會解決,但它不工作。

感謝

回答

1

如果重寫此爲等效的方法定義,那麼它可能會更容易弄清楚。

def self.time_range 
    a = DateTime.parse(start_time_am) 
    where("#{a} <= ?", Time.now.strftime('%H')) 
end 

start_time_am從哪裏來?該方法沒有任何參數。

+0

start_time_am是在數據庫中的字段。我想這會更容易輸入日期時間而不是字符串.. – simonmorley

+0

你能舉一個你期望這個記錄返回的記錄的例子嗎?是的,start_time_am是DB中的一列,它被定義爲模型實例上的一個方法。但是它並沒有在課堂上定義,你期望它會以其他方式返回嗎? –

+0

只是試圖轉換值,以便我可以與Time.now比較 – simonmorley

0

最後,我做了轉換在where語句,並擺脫了虛擬屬性:

def self.time_available 
    where("cast(start_time as time) <= cast(now() as time) and cast(end_time as time) >= cast(now() as time)") 
end 

希望幫助別人

+0

虛擬屬性被稱爲「虛擬」,因爲它們不在數據庫中。這就是爲什麼你不能在「where」子句中使用它們的原因。但是,我不知道你爲什麼要投射start_time和end_time,是不是他們在數據庫模式中定義爲'time'列? –

+0

順便說一下,如果您認爲問題已解決,則應在答案上單擊「接受」。 –

+0

爲虛擬位乾杯。開車讓我瘋了,但現在至少我明白了。加上一個讓我去,我已經接受你的答案。小號 – simonmorley