2012-05-31 52 views
0

上的其他列進行排序我正在使用Ruby 1.8.7對Rails 2應用程序進行一些維護。我正在使用will_paginate。請問Paginate可以通過某些列進行排序,但不能通過Model

我有以下問題: 致電時current_user.products.paginate(:頁面=> 1:爲了=> 「的updated_at ASC」)它的訂單,如預期的基礎上,在產品的updated_at屬性。

但是,當調用current_user.products.paginate(:page => 1,:order =>「released_at asc」)時,它不會按照預期對released_at進行排序。事實上,無論我是按照「asc」還是「desc」指定排序,我都會返回相同的集合。

updated_at和released_at都是在模型上定義的並存在於數據庫中的屬性,並且所有值都是非空的。在模型上沒有定義default_scope。

什麼可能導致這種情況,以及如何糾正?

下面的添加產品說明(爲簡便起見,我只列出了相關的字段):

|字段|類型|空| Key |默認|額外|

| released_at | datetime |是| | NULL | |

| updated_at | datetime |是| | NULL | |

+0

很高興看到來自日誌的sql查詢。 –

+0

從日誌中的非工作分頁語句開始的SQL查詢:SELECT * FROM'products' WHERE('products'.partner_id = 171)ORDER BY released_at desc LIMIT 0,50以及日誌中工作分頁狀態SQL的SQL查詢:SELECT * FROM'產品'WHERE('products'.partner_id = 171)ORDER BY updated_at desc LIMIT 0,50。 – Stanley

+0

你還可以從mysql的DESC產品中查看數據類型嗎? – Ivan

回答

1

產品模型繼承自也定義released_at屬性的模型。用於released_at的方法在Ruby on Rails代碼中被重載,因此如果在Product的一個實例產品上調用product.released_at,那麼它實際上會調用父模型的released_at值。因此,從rails控制檯看來,released_at不是null並且包含一個值。

但是,直接查看數據庫顯示,產品模型中的released_at爲空,因此即使will_paginate請求正確執行,也不會執行排序,因爲值完全相同(空)。在對updated_at屬性執行完全相同的查詢的情況下,排序可以工作,因爲該屬性不爲空。我錯過了這個,因爲我從Rails控制檯檢查了空值,而不是直接在MySQL中檢查。

我的解決方案是在產品模型上定義一個named_scope,該模型根據父模型中的值進行排序。然後我調用指定範圍的paginate函數。

-1

有時需要爲訂購字段定義索引才能使其工作。

+0

這是什麼意思?請澄清。 – Stanley

+0

我的意思是列的數據庫索引。 – ABrukish

+0

當我直接在MySQL中調用SQL命令時,它正確地命令。所以我不認爲這是這個問題。 – Stanley

相關問題