2017-10-16 83 views
1

我有一個rails API,它返回JSON到我的React前端。我試圖按集合中每個項目的計算值進行排序。我有一個Space模型,它具有area屬性和count屬性。我想按total_area排序,這只是area * count。我能夠做到這一點使用sort_by但過程相當緩慢,甚至少於100個記錄:如何使用Activerecord中的計算值進行排序?

@spaces = Space.all 
@spaces = @spaces.sort_by(&:total_area) 

total_areaSpace類方法:

def total_area 
    self.area * self.count 
end 

反正有沒有做到這一點在數據庫內獲得速度的改善?我已經使用order方法嘗試:

@spaces.order("count * area" => :asc) 

,但我得到了以下的Postgres錯誤:

PG::UndefinedColumn: ERROR: column spaces.count * area does not exist 

是可以做到這一點的數據庫?任何關於我如何能做到的建議,或者我如何能夠更快地做到這一點,都會非常感激。

回答

2

當你的手#order哈希:

@spaces.order("count * area" => :asc) 

它假定鍵是一列的名稱,以便它發出這樣的SQL的數據庫:

order by "count * area" asc 

因此,PG::UndefinedColumn例外。順便說一句,在SQL中使用雙引號引用列名和表名等標識符。

如果您要發送到數據庫中的表達式作爲ORDER BY子句中的一部分,那麼你想那表情傳遞給#order作爲一個字符串:

@spaces.order('count * area') 
# If you want to be explicit about the sorting direction: 
@spaces.order('count * area asc') 
# If you might have other tables with those column names: 
@spaces.order('spaces.count * spaces.area') 
相關問題