Rails未定义的列方法

时间:2013-09-24 11:49:53

标签: ruby-on-rails-3 activerecord

我有奇怪的问题,我有模型的表产品

class Product < ActiveRecord::Base
  attr_accessible :id, :category_id, :name, :barcode, :price, ...

但是当我运行 rails c 时,我无法访问属性。

  
    

product = Product.where(“barcode ='B0000000008'”)

  
  Product Load (22.5ms)  EXEC sp_executesql N'SELECT [products].* FROM [products] WHERE (barcode=''B0000000008'')'

 => [#<Product id: 8, category_id: 2, name: "Aplikovaná boj. umění (1 hodina)", barcode: "P0000000008", price: #<BigDecimal:362f9c8,'0.95E2',9(36)>, ... ] 

>> product.name
=> "Product"

>> product.class
=> ActiveRecord::Relation

>> product.barcode
!! #<NoMethodError: undefined method `barcode' for #<ActiveRecord::Relation:0x00000003a354c8>>

>> product.id
!! #<NoMethodError: undefined method `id' for #<ActiveRecord::Relation:0x00000003a354c8>>

>> product.price
!! #<NoMethodError: undefined method `price' for #<ActiveRecord::Relation:0x00000003a354c8>>

但我能够运行

>> product = Product.new
>> product.name = "xx"
 => "xx" 
>> product.class
 => Product(id: integer, ...)

Product class和ActiveRecord :: Relation类之间有什么区别?我如何从哪里获得Product类方法?谢谢

1 个答案:

答案 0 :(得分:2)

首先,where返回ActiveRecord关系。简单来说,它只是未执行的Active Record查询。您可以将“order”,另一个“where”,“join”等查询链接到此,并且只有当您想要访问此查询返回的记录时才会对查询进行评估。

所以你做的是

ActiveRecord::Relation.barcode自然会失败。

无论如何,只需执行product = Product.where("barcode='B0000000008'").first,您就可以获得可以调用barcode

的产品对象