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がrelate_customers_count_for_total_spentよりも大きい理由。以下である必要があります。

*更新-1*

私は2番目の問題を受け取りました:

@relevant_customers_for_total_spent.length 

要素の数を数える正しい方法です。

更新-2

[2,3,4,5,6,75,56,57,58,59,60,61,62]のような配列にいくつかの顧客IDがあります。Customerモデルにtotal_amountという属性があります。total_amount(DESC)の順序ですべての顧客IDを再編成したいと思います。制限を指定する別の要因があります。つまり、そのリストから必要な顧客の数です。その5のようなものです。したがって、total_amountに基づいてそのaraayの上位5人の顧客が必要です。

4

1 に答える 1

4

重要なのは、ARelは、句countなしでクエリを生成するのに十分賢いということです。order

考えてみてください。#countリレーションはselect count(*) ...SQLクエリを返し、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 に答える