1

我正在为一个看似简单的概念而苦苦挣扎。使用 ActiveRecord 查询获取单个项目后,我想访问该项目的属性,但我得到nil:NilClass 的未定义方法“msg”

我使用的模型如下:

class Provider < ActiveRecord::Base
  attr_accessible :alias, :name
  validates :name,  :presence => true
  has_many :histories

  def lastActive
   return History.where(:provider_id => self.id).last
  end
end

class History < ActiveRecord::Base
  belongs_to :provider
  attr_accessible :available, :msg

  scope :active, where(:available => true)
  scope :recent, :limit => 1, :order => 'created_at DESC'

end

因此,我有 2 种不同的方法来获取给定 Provider 的最新历史记录项:Provider.lastActive 和 provider.histories.active.recent.first。两者都无法获取正在返回的 History 对象的任何属性。

在 erb 方法中使用 Provider.lastActive,如下所示:

<%= provider.lastActive.msg  %>

为 nil:NilClass产生未定义的方法“msg”

但,

<%= provider.lastActive.inspect  %>

产生类似的东西:

> #<History id: 35, available: true, when: nil, msg: "my message", provider_id: 1, created_at: "2012-09-18 07:12:50", updated_at:
> "2012-09-18 07:12:50">

使用历史范围的相同结果,例如:

provider.histories.active.recent.first & provider.histories.active.recent.first.inspect

我在这里想念什么?做完 Model.find.last 为什么我不能访问返回的模型的属性?

在这种我真的只想要1个属性的情况下,会有什么问题:

Model.find.last.some_attribute
4

1 回答 1

0

您肯定要删除该行:

attr_accessible :available, :msg

这是不对的,会引起问题。

我不明白为什么它会为 nil:NilClass 错误提供一个未定义的方法“msg”,但把它拿出来看看是否能解决它。

如果你得到最后一个,也不是你应该有一个订购方法。

最后,一旦你让它工作,因为你有历史关联,你可以定义 lastActive 如下:

def last_active
  return histories.order(:id).last
end
于 2012-09-18T19:38:36.367 回答