Rails 3,Active Record查询返回ActiveRecord :: Relation对象,而不是对象

时间:2010-12-13 06:55:20

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

由于我对新ActiveRecord查询界面的误解,我觉得这是一个简单的问题,但请举例说明:

>> Category.first.recipes
=> [ ... ] # array of recipes

然而:

>> Category.where(:id => 1).recipes
=> NoMethodError: undefined method `recipes' for #<ActiveRecord::Relation:0x000001033dc9e0>

这里发生了什么?为什么我的where方法会返回ActiveRecord::Relation个对象?如何从查询中检索对象?

3 个答案:

答案 0 :(得分:43)

这实际上是故意的。

Category.where(:id => 1)
# Is Equivalent to Category.all(:conditions => {:id => 1}})
Category.where(:id => 1).first
# Is equivalent of Category.first(:conditions => {:id => 1}})

只有在调用first,each等特殊方法时才会检索对象。这称为延迟加载,当您想要缓存视图时,这是一个很好的。详细了解here的原因。

答案 1 :(得分:6)

Category.where(:id => 1).recipes

返回一个数组。如果你只是做Category.where(:id => 1).first.recipes它应该有效。

答案 2 :(得分:4)

但是,如果您只是在针对id进行操作,请使用find方法 Category.find(1)将返回Category对象 所以:
    Category.find(1).recipes