2017-10-16 16 views
1

JSONをReactフロントエンドに返すrails APIがあります。私は、コレクション内の各アイテムの計算値でソートしようとしています。私はarea属性とcount属性を持つSpaceモデルを持っています。私はtotal_areaによって応答を並べ替えるといいです。これはちょうどarea * countです。私はsort_byを使ってこれを行うことができるんだが、プロセスはさらに100未満のレコードを持つかなり遅いです:Activerecordで計算された値でソートする方法は?

def total_area 
    self.area * self.count 
end 

これを行うには、とにかくあり:total_areaSpaceクラスメソッドである

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

データベース内で速度の向上を得るには?データベースでこれを行うことが可能である

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

です:私はorder方法使用して試してみた:

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

をしかし、私は、次のPostgresのエラーを取得しますか?どのように私ができるか、または私はこの種のより迅速に行うことができますどのような提案は非常に感謝します。

答えて

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') 
関連する問題