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

そのため、特定のプロバイダーの最新の履歴アイテムを取得するには、Provider.lastActive と provider.history.active.recent.first の 2 つの方法があります。どちらも、返される履歴オブジェクトの属性のいずれかを取得できません。

次のように、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">

次のような History のスコープを使用した同じ結果:

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' が表示される理由がわかりませんが、それを取り出して、それが修正されるかどうかを確認してください。

また、最後のものを取得する場合は、注文方法が必要です。

最後に、動作するようになると、history の関連付けがあるため、次のように lastActive を定義できます。

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