2015-02-11 14 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