我正在努力寻找一个看似简单的概念。在使用ActiveRecord查询获取单个项目之后,我想访问该项目的属性但是得到未定义的方法`msg'为nil:NilClass
我使用的模型如下:
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
因此,我有两种不同的方式来获取给定提供者的最新History项:Provider.lastActive和provider.histories.active.recent.first。两者都无法获得正在返回的History对象的任何属性。
在erb方法中使用Provider.lastActive,如下所示:
<%= provider.lastActive.msg %>
为nil产生未定义的方法`msg':NilClass
但是,
<%= 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
答案 0 :(得分:0)
您肯定想要删除该行:
attr_accessible :available, :msg
这是不对的,会导致问题。
我不明白为什么它会为nil:NilClass错误提供一个未定义的方法`msg',但是把它拿出去看看是否能修复它。
如果你得到最后一个,也不应该有订单方法。
最后,一旦你开始工作,由于你有历史关联,你可以按如下方式定义lastActive:
def last_active
return histories.order(:id).last
end