为什么有些查询可以再次查询而有些查询不能查询?

时间:2012-04-14 17:03:25

标签: sql ruby-on-rails ruby

对我来说,这是关于.reverse vs .order('id DESC')

如果我有

history = where(user_id: user).order('id DESC')

我仍然可以执行其他查询,例如history.where(person_id: person)

如果我有

history = where(user_id: user).reverse

我得到:NoMethodError: undefined method 'where' for #<Array:0x000001031a3408>

这是因为这些函数在它们应该使用的数组类型上有所不同(关联与常规数组)吗?我有什么选择?

2 个答案:

答案 0 :(得分:3)

ActiveRecord query methods(例如whereorderjoins等)返回ActiveRecord::Relation。这允许您链接方法以构建查询,并且在您使用实际数据之前不会执行查询。

由于reverse不是查询方法,因此它对Ruby中的实际数据进行操作,因此执行查询以便Ruby可以对数据进行操作,并返回Array。由于现在您只有数据(以Array的形式)而不是ActiveRecord::Relation,因此您无法调用其他查询方法。

答案 1 :(得分:2)

reverse是activerecord查询接口之外的方法,而order位于接口中。执行reverse后,您将不再拥有资源,而是一个数组。在反转输出之前,您需要执行任何sql方法(如where)。