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

标签 ruby-on-rails activerecord

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

相关文章:

ruby-on-rails - 如何获取包含表的列名的数组

ruby-on-rails - 遵循 DCI 设计时在哪里进行验证?

ruby-on-rails - 这两个陈述之间有什么区别,您为什么会选择它们?

php - 在为 codeigniter 的嵌套选择编写 activerecord 时遇到问题

ruby-on-rails - 如何跳过失败的迁移? ( rake 数据库:migrate)

ruby-on-rails - Rails 中的常量值

ruby-on-rails - 删除用户帐户后如何重置 omniauth-google-oauth2 access_token

ruby-on-rails - rails : pass 2-d array to link_to

php - 如何在 Laravel 中链接数据库关系(多个 has_many?)

javascript - Angular $routeParams 是空的