在object.find(:all,:conditions)中返回数组时的undefined方法

时间:2012-09-06 07:37:40

标签: ruby-on-rails activerecord ruby-on-rails-2

我正在使用:

rails 2.3.9 ruby 1.9.3 windows 7 ultimate rubygems 1.8.24

这有效:

@inventories = Inventory.find :first, :conditions => {:siteId => params[:siteId]}

这不是

@inventories = Inventory.find :all, :conditions => {:siteId => params[:siteId]}

错误讯息:

NoMethodError (undefined method `siteId' for #Array:0x49738f8)

2 个答案:

答案 0 :(得分:1)

对于rails 2.x,您的语法略有错误 如果要查找具有特定条件的所有记录,请尝试使用多个条件的此示例

@inventories = Inventory.find(:all, :conditions => ["siteId=? and priority=?", params[:siteId], 3])

答案 1 :(得分:0)

当你写

@inventories = Inventory.find :first, :conditions => {:siteId => params[:siteId]}

上面的行为Inventory提供了一个(第一个)对象,具体取决于与给定条件匹配的默认顺序,因此您可以使用@inventories.siteId。但是,当没有行符合给定条件时,它将返回nil,在这种情况下,如果您尝试使用@inventories.siteId,则会为nil抛出错误undefined method siteId'

但是当你写作

@inventories = Inventory.find :all, :conditions => {:siteId => params[:siteId]}

上面的行给出了Inventory对象的数组,如果您的查询返回1个或多个对象,即行和空白数组,即[],如果现在的行满足条件,则无关紧要。因此,当您尝试使用@inventories.siteId时,实际上是在Array上应用siteId而不是Inventory的对象,它会为#Array`抛出错误undefined method siteId'。但是,以下将正常工作

@inventories.each{|p| puts "#{p.siteId}"}