使用Ransack对使用SQL查询的时间戳进行排序

时间:2015-04-15 16:28:09

标签: ruby-on-rails ransack

我正在处理Parent班级有很多Children的情况。在我看来,我正在显示每个父母的最后一个孩子,以登录该应用程序。为此,我在我的Parent模型上创建了一个范围last_child_sign_in,用于执行复杂的SQL查询。我将该范围放在我的控制器中,使其具有@search = Parent.last_child_sign_in.search(params[:q])。然后,我在该结果之上运行另一个查询,以从关联的订单表中获取Order计数。

在我看来,我有一个sort_link(@search, :last_child_sign_in, 'Last login'),它将Parameters: {"q"=>{"s"=>"last_child_sign_in desc"}}发送到控制器,但它根本不会影响@search对象的排序。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

经过多次摆弄这个问题后,我得出的结论是 Ransack在这种情况下无法处理排序。我最终创建了逻辑,在控制器中使用SQL手动对列进行排序:

if( sorting_by_last_child_sign_in? )
  if( params[:q][:s].ends_with? 'asc' )
    direction = "DESC NULLS LAST"
  else
    direction = "ASC NULLS LAST"
  end
  parents_scope = 
    parents_scope.order( "MAX(child_users.current_sign_in_at 
    AT TIME ZONE 'UTC' AT TIME ZONE 'US/PACIFIC') #{direction}" )
end

我爱我一些Ransack,但有时你只需要用老式的方式做事。