一个客户端有很多状态。为了获得最新状态,我在 Status
上使用以下范围.
scope :latest, -> { order(:created_at).last }
这在 Rails 控制台中按预期工作。
client = Client.last
client.statuses.latest
=> #<Status id:...
client.statuses.latest.stage
=> 1
但是,它在 View 中没有按预期工作。 (这是动态表单的一部分,其中
f.object
是一个 Client
对象)。<%= 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
对象作为 Controller 中的实例变量进行测试,它按预期工作。这个问题似乎只有在访问 Client
时才会发生通过表单对象。这是错误还是某种限制?反正围绕它?
更新 2
找到了解决这个问题的方法。
<%= f.object.statuses.latest.stage unless f.object.statuses.latest.blank? %>
我不明白为什么会这样,因为 latest 不是空白并返回一个阶段,所以如果有人能解释一下,我们将不胜感激。
最佳答案
请注意 所有范围方法 将返回 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
关于ruby-on-rails - 在 View 中使用带有 .last 的作用域会返回一个 AssociationRelation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28459943/