由于我对新ActiveRecord查询界面的误解,我觉得这是一个简单的问题,但请举例说明:
>> Category.first.recipes
=> [ ... ] # array of recipes
然而:
>> Category.where(:id => 1).recipes
=> NoMethodError: undefined method `recipes' for #<ActiveRecord::Relation:0x000001033dc9e0>
这里发生了什么?为什么我的where
方法会返回ActiveRecord::Relation
个对象?如何从查询中检索对象?
答案 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