如何通过自定义方法对表进行排序

时间:2017-07-06 09:14:47

标签: ruby-on-rails ruby postgresql

我使用带有PostgeSQL的rails 5,我有2列的模型:

amount: integer
interval_count: integer

我的模型amount_per_interval中定义的自定义方法基本上返回amount/interval_count(它在应用级别计算)。现在我需要按这个amount_per_interval值对整个表进行排序,但我需要在数据库级别上进行排序,因为我使用了分页(而且我还有数百万条记录,所以我不会这样做想把所有这些加载到内存中。)

是否有可能在此型号上定义此类自定义排序?我无法找到任何解决方案。

更新

我基本上想要重写这个SQL:

SELECT (amount / interval_count) as amount_per_interval FROM my_table ORDER BY amount_per_interval

进入ActiveRecord的界面,仍然保持与分页和其他AR方法的兼容性。

2 个答案:

答案 0 :(得分:0)

如果您需要进行排序,我建议您在表格中添加amount_per_interval。您可以在每次插入记录时进行计算。 然后,您可以在SQL查询中执行此操作:

SELECT (...) ORDER BY amount_per_interval

或使用Rails查询界面:

YourModel.order(amount_per_interval: :desc)

生成此查询

SELECT "table_name".* FROM "table_name" ORDER BY "table_name"."amount_per_interval" DESC

这会将amount_per_interval排序的所有记录从最高到最低加载。

答案 1 :(得分:0)

您可以使用selectorder方法:

YourModel.select("*, (amount / interval_count) as amount_per_interval")
         .order("amount_per_interval")

要访问amount_per_interval,您只需在加载了上述语句的对象上调用它。

your_model_object.amount_per_interval