2009-11-12 76 views
0

我有一些球員和球員有貿易狀態。我認爲自己很聰明,並且有一個單獨的TradeState模型,這樣一個玩家有一個trade_state_id(一個玩家只能進入到遊戲中),而不是像「積極」和「不活躍」那樣的硬代碼交易狀態。一次一個交易狀態)。Rspec,模型加載順序,燈具和named_scope挑戰

現在,通過使用命名範圍,然後說「Player.active」,能夠獲得所有活動玩家將是一個方便。要做到這一點,我需要得到的匹配「活動」的TradeState記錄的ID,所以我在Player類想出了這個:

named_scope :active, :conditions => {:trade_state_id => TradeState.active.first.id} 

在腳本/控制檯進行測試時,這個工程就像一個魅力,但是當我去測試時它不起作用。我正在使用RSpec,但我懷疑這是不恰當的。當我運行最瑣碎的測試,我得到以下錯誤:

「名爲id的零,這將被錯誤地4」

至於我可以告訴大家,測試框架加載和分析模型按字母順序排列。該框架解析Player模型中的named_scope調用,並盡職地查找活動的第一個TradeState記錄的標識。但是,該模型尚未處理,尚未準備好,因此導致無法獲得id的錯誤。

起初我以爲是因爲在trade_states表中可能沒有任何記錄,所以我創建並保存了之前(:each)塊中需要的trade_states,但這並不起作用。於是我做了一些固定裝置並嘗試加載它們,但那不起作用。

這看起來似乎合理嗎?還有其他解釋嗎?如何解決?我可以試着嘲笑TradeState對象,然後我就放棄了。

非常感謝您的時間。

+0

我會說,「是」,你的數據庫中沒有任何東西,因此在nil上調用「id」(由TradeState.active.first返回)會引發錯誤。 我不能說爲什麼你的表是空的,因爲你只說「它沒有工作」沒有代碼。 – 2009-11-12 05:58:28

回答

0

您提到的這段代碼會在玩家「加載」時執行。因此,即使您在之前(:每個)塊中創建設置數據,該模型甚至可能在此之前加載。爲了解決這個問題,你可以嘗試一些事情,如:

named_scope :active, lambda { {:conditions => {:trade_state_id => TradeState.active.first.id} } } 

這確保了無論何時你調用named_scope的TradeState.active被調用。

但是你打電話給TradeState.active.first。相反,你可以通過這個很好的方式,您TradeState模型這麼做

:conditions => {:trade_state_id => TradeState::ACTIVE} 

用下面的代碼:

class TradeState < ActiveRecord::Base 
    def self.const_missing(sym) 
    const_set(sym, find_by_name(sym.to_s)) 
    end 
end 
+0

我喜歡使用常量並動態設置它的解決方案。但是,當運行測試時,同樣的問題仍然存在;即雖然trade_states表中有記錄,但在TradeState模型始終產生零引用之前實例化Player模型。 – 2009-11-14 22:21:14

+0

你可以發佈你的rspec代碼,以獲得更清晰的wats圖片.. – Selva 2009-11-15 00:49:35

0

這實際上是一個潛在的「預期」的結果。如果你沒有現役球員,然後

TradeState.active 

是空的,因而

TradeState.active.first 

爲零,

,從而

TradeState.active.first.id 

電話Object::id nil對象上。

您可以試試:

TradeState.active.empty? ? 0 : TradeState.active.first[:id] 

在任何情況下,一定要包括trade_states只是爲了確保他們是本作的加入。

0

不幸的是,雖然所有這些建議都非常好,但運行測試用例時沒有什麼可靠的工作。起初,我退出了所有這些代碼,但是我必須編寫的代碼不那麼吸引人,於是我開始重新思考問題。

因爲我們會根據他們的貿易狀態大量查詢玩家,因此在數字貿易狀態欄中有一個索引是一個明確的優先事項。然而,沒有什麼可以說貿易國需要成爲一張表,因爲只有少數貿易國定義了貿易國,並且在規定的貿易國不太可能出現大幅波動。

因此,我自己製作了TradeState類,不再從ActiveRecord派生,並定義了我需要的常量。

謝謝大家的想法和解決方案。