对非属性使用Ransack sort_link

时间:2012-10-01 14:41:26

标签: ruby-on-rails-3 ransack

我在我的rails项目中使用Ransack的sort_link来显示我的付款模型的费用列表。但是,'fee_amount'不是 payment 模型的属性,而是 bill 模型的类方法(属于付款)。我现在拥有的是:

  

<%= sort_link @search,:bill_fee_amount,“便利费”%>

应该访问当前付款帐单并在帐单上调用'fee_amount'方法,该方法会执行一些计算并返回一个浮子。这是我希望搜索的浮标。

可以这样做,还是我只能根据我正在处理的模型的属性进行排序?

2 个答案:

答案 0 :(得分:2)

你不能随便搜查,但请检查this issue。似乎有些人已经为这个功能做了补丁,但我还没有尝试过。

Ransack,在内部,它总是使用数据库中定义的模型,我无法使用范围创建的临时表。

PD:将评论作为答案重写,因为我总是回到这个问题:P

答案 1 :(得分:0)

Ransack是MetaSearch的继承者,根据MetaSearch文档,您可以创建自定义搜索。这是链接:

https://github.com/ernie/meta_search

我认为这样的事情会起作用:

scope :sort_by_bill_fee_amount_asc, joins(:bill).select('sum("bills"."fee_amount") AS bill_fee_amount').order('bill_fee_amount ASC')
scope :sort_by_bill_fee_amount_desc, joins(:bill).select('sum("bills"."fee_amount") AS bill_fee_amount').order('bill_fee_amount DESC')

问题不清楚计算究竟是什么,所以我认为它只是一个名为fee_amount的字段的总和。不幸的是,它可能比这更糟糕,我认为讨厌的SQL计算需要包含在Payment模型中。

我认为关键点是SQL需要包含您要排序的列,因此您需要让SQL计算它并将其包含在Ransack想要搜索的名称中。

我希望有所帮助。