2012-05-15 84 views
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. 爲什麼在實際查詢中沒有訂單子句?
  2. 爲什麼@ relevant_customers_for_total_spent.count大於relevant_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。所以我需要從總數的最高5個客戶。

+0

我相信你會做BR不正確的查詢。你能解釋一下查詢背後的想法嗎? – gmile

+0

'哪裏('ID IN(?)',@ customers_ids)' - 多麼醜陋的建築!使用'where(id:@customers_ids)'。如果你傳遞一個數組,那麼Rails會爲你創建'IN'。如果是單個值,它會生成'='子句。傳遞關係(如'Model.select(:id)')會給你嵌套的SQL查詢。 – jdoe

回答

4

問題是:ARel足夠聰明,可以在沒有order子句的情況下生成count查詢。

試想一下:#count關係返回select count(*) ... SQL查詢,它反過來返回一個數字 - 爲什麼你需要在這裏訂購的東西?

難怪#length返回正確的數字。這是因爲被調用的關係對象不知道如何響應調用,會觸發自身從DB(通常是數組的實例)返回結果,然後將調用委託給它。因此,在數組實例上調用#length可返回預期的元素數。

更新

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

Customer.where(id: ids).order('total_amount DESC').limit(5) 
+1

想象一下,我有一個數組中的客戶ID。現在我想訂購他們total_amount DESC。我將如何做到這一點.. –

+1

你可以請更新一些更具體的信息,你想要完成什麼? – gmile

+1

更新。請檢查一下。 –