2015-02-11 18 views
2

客戶端有許多狀態。要獲得最新狀態,我在Status上使用了以下範圍。在.last中使用範圍正在返回查看關聯關係

scope :latest, -> { order(:created_at).last } 

這在Rails控制檯中按預期工作。

client = Client.last 
client.statuses.latest 
=> #<Status id:... 
client.statuses.latest.stage 
=> 1 

但是,它在視圖中無法正常工作。 (這是f.objectClient對象的動態表單的一部分)。

<%= f.object.statuses.latest.inspect %> 

這將返回如預期的那樣Status對象:#<Status id:...

但如果我現在嘗試在對象上訪問屬性,<%= f.object.statuses.latest.stage %>我碰到下面的錯誤。

undefined method `stage' for #<ActiveRecord::AssociationRelation []> 

哪扔了我,因爲它應該是Status對象。加上我的困惑,如果我嘗試一個不存在的屬性,如<%= f.object.statuses.latest.foobar %>,我得到以下錯誤。

undefined method `foobar' for #<Status:0x007ff615fcdb28> 

更新

我試圖設置一個Client對象爲控制器以測試一個實例變量,它按預期工作。這個問題似乎只在通過表單對象訪問Client時纔會發生。

這是一個錯誤或某種限制?無論如何圍繞它?

更新2

找到一種方法來解決這個問題。

<%= f.object.statuses.latest.stage unless f.object.statuses.latest.blank? %> 

我不明白爲什麼這個工程,因爲最新的不是空白,並返回一個階段,因此,如果任何人都可以解釋,將不勝感激。

+0

奇怪。 「stage」是一個屬性,還是「狀態」中的方法?你能提供嗎? – dgilperez 2015-02-11 17:15:43

+0

'stage'只是'Status'上的一個屬性,它在控制檯中按照預期返回一個整數。 – steharro 2015-02-11 17:18:33

回答

2

請注意,所有示波器方法將返回一個ActiveRecord :: Relation

我會重構你的模型,像這樣來解決這個問題,仍然可以得到相同的功能。

class Status < ActiveRecord::Base 
    .... 
    scope :newest, -> { order(:created_at) } 

    def self.latest 
     Status.newest.first 
    end 
end 

而且你應該能夠只是調用

client = Client.last 
client.statuses.latest 
+0

感謝您的建議。再次,這是在控制檯中工作,但在視圖'nil:NilClass'的未定義方法階段中引發以下異常。 – steharro 2015-02-11 17:45:17

+0

檢查Rails日誌中的SQL查詢,在那裏沒有返回任何東西,如果在第一個**上得到零的話,那麼這意味着關係是空的 – DevDude 2015-02-11 19:03:29