2014-02-26 27 views
4

例如,假設我有一個名爲Products的模型,並在Products控制器中爲product_list視圖顯示以下代碼,以顯示排序的產品。重新排序軌道中的活動記錄而不重新查詢數據庫?

@products = Product.order(params[:order_by]) 

並讓我們想象在product_list視圖中,用戶可以使用下拉列表按價格,評分,重量等進行排序。數據庫中的產品不會頻繁更改。

我很難理解的是,當用戶選擇一個新的order_by過濾器時,rails是否必須查詢,或者rails會以某種方式緩存活動記錄以便在服務器端進行重新排序?有沒有辦法寫它,所以如果用戶排序,rails將不會重新查詢結果?

感謝,

+0

如何/你在哪裏緩存ActiveRecord對象?如果對象僅在實例變量中,則這些對象不會在請求之間留在內存中。它們存儲在memcache或類似的東西嗎?如果你不想運行另一個查詢來檢索對象,你可以做排序客戶端(在JavaScript中)。 – Coenwulf

+0

要添加到@Coenwulf,我發現DataTables插件可以讓jquery在顯示對象列表時很有用。它內置分類功能。 [鏈接](https://datatables.net) –

+0

關閉主題:不要這樣做'Product.order(params [:order_by])'這是activerecord不會消毒用戶輸入的地方之一 - 它是開放的SQL注入攻擊,閱讀此http://stackoverflow.com/questions/7771103/rails-3-activerecord-order-what-is-the-proper-sql-injection-work-around的更多信息 – house9

回答

9

您可能正在尋找sort_by方法(即,如果因此在作出查詢,如果用戶只是想通過一個不同的變量排序是沒有意義的產品表中不經常變化)。它將允許您對服務器端的集合進行排序,而不使用任何活動記錄查詢。

這段代碼的結果:

@products = Product.all 
@products = @products.sort_by {|product| product.name} # Ruby Sorting 

應該是一樣的

@products = Product.order(:name) # SQL sorting 
+0

在[大約]什麼點/大小做這個比單純使用活動記錄的順序方法慢? – michaelsking1993

+0

我會說,如果你可以做一個SQL排序,只要去做,它應該總是更快。 – Oxynum

+0

有趣...我的印象是,如果你可以避免重新查詢數據庫,你應該。因此,如果我執行'Product.where(「name LIKE?」,「n%」)',則需要額外的查詢才能執行'.order(:created_at)'。這是一個錯誤的假設嗎?這不就是上述問題的重點嗎? – michaelsking1993