The where
方法返回一个ActiveRecord::Relation
对象,并且该对象本身不发出数据库查询。它是where你使用这个重要的对象。
在控制台中,您可能会这样做:
@person = Person.where(name: "Jason")
进而blammo它发出一个数据库查询并返回一个似乎是名为 Jason 的每个人的数组。耶,活动记录!
但然后你做了这样的事情:
@person = Person.where(name: "Jason").where(age: 26)
然后会发出另一个查询,但这个查询是针对 26 岁、名叫 Jason 的人的。但这只是发出one查询,那么另一个查询去哪里了?
正如其他人所建议的,发生这种情况是因为where
方法返回一个代理对象。它实际上并不执行查询并返回数据集,除非要求这样做。
当你跑步时anything在控制台中,它将输出您运行的任何结果的检查版本。如果你把1
在控制台中按 Enter 键,你会得到1
回来因为1.inspect
is 1
。魔法!同样适用于"1"
。其他各种物体没有inspect
定义了方法,因此 Ruby 又回到了Object
返回一些东西ghastly like <Object#23adbf42560>
.
每一个ActiveRecord::Relation
对象有inspect
其上定义的方法,以便引发查询。当您在控制台中编写查询时,IRB 将调用inspect
根据该查询的返回值并输出一些几乎人类可读的内容,例如您看到的数组。
如果您只是在标准 Ruby 脚本中发出此命令,那么在检查对象之前不会执行任何查询(通过inspect
)或通过使用迭代each
,或者有to_a
方法调用它。
直到这三件事之一发生之前,你可以链接尽可能多的where
根据您的喜好对其进行陈述,然后当您do call inspect
, to_a
or each
然后它最终会执行该查询。