2

我正在触发此查询

p "my query starts here..."
@relevant_customers_for_total_spent = Customer.order("total_amount DESC").where('id IN (?)',@customers_ids).limit(relevant_customers_count_for_total_spent)

 p " -------  "
 p relevant_customers_count_for_total_spent  # output is: 1139
 p @relevant_customers_for_total_spent.count # output is: 2888
 p " -------  "

更多日志是说实际触发的查询是:

SELECT COUNT(*) FROM `customers` WHERE (id IN (2,3,4,5,6,75,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,75,296,297,298,2889)) LIMIT 1139

所以问题是:

  1. 为什么实际查询中没有order子句?
  2. 为什么@relevant_customers_for_total_spent.count 大于related_customers_count_for_total_spent。它应该等于或小于。

*更新-1 *

我得到了第二个问题:

@relevant_customers_for_total_spent.length 

是计算元素数量的正确方法。

更新 - 2

我在数组中有一些客户 ID,例如 [2,3,4,5,6,75,56,57,58,59,60,61,62]。我在 Customer 模型中有一个属性,即 total_amount。我想按照 total_amount (DESC) 的顺序重新排列所有客户 ID。我还有一个指定限制的因素,即我需要从该列表中获得多少客户。一些事情,如果它是 5。所以我需要根据 total_amount 来自那个 araay 的前 5 名客户。

4

1 回答 1

4

关键是:ARel 足够聪明,可以生成不带子句的count查询。order

想一想:#countrelation 返回select count(*) ...SQL 查询,而后者又返回一个数字 - 为什么需要在这里订购的任何东西?

难怪#length返回正确的数字。这是因为#length被调用的关系对象不知道如何响应调用,触发自身从 DB 返回结果,该结果通常是数组的实例,然后将调用委托给它。因此,调用#length数组实例会返回预期的元素数量。

更新

ids = [1,2,3,4,5]

Customer.where(id: ids).order('total_amount DESC').limit(5)
于 2012-05-15T08:55:34.923 回答