gpt4 book ai didi

ruby-on-rails - 在 View 中使用带有 .last 的作用域会返回一个 AssociationRelation

转载 作者:行者123 更新时间:2023-12-04 03:44:59 25 4
gpt4 key购买 nike

一个客户端有很多状态。为了获得最新状态,我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com