2017-04-03 42 views
0

我有这样的代码来查询病人红宝石交替订单:查询与上轨

Patients.order(params[:sort]) 

我怎样才能实现这个所以每次这个查询将执行的结果是在交替的顺序这样的:(升序 - >降序 - >升序 - > ...)?

此代码是上一个Ruby on Rails应用程序的控制器实现。

+0

似乎不是一个好主意 –

+0

为什么?请解释 – Mattia

+1

这取决于你在查询中包括了'asc'或'desc',还可以切换是*自己*。如果您尝试实现可单击列标题的可更改列时,此状态将保留在模型/控制器图层之外。你的意见应该用'asc' /'desc'提交正确的查询。 – meagar

回答

2

要实现这一点,你应该储存一些关键的任何地方,对不对?在数据库中存储它是不是一个好主意,因为它是为每个页面加载一个+1额外select和+1额外update查询。如果我们在任何地方存储在服务器上,例如,在Redis,这将是全球所有用户,否则我们将不得不尽可能多的按键,便可存储,因为我们有很多用户。那么为什么不把它存储在用户的一边呢?我认为最好的方法是将其存储在cookies中,并且每次查询后都将其反转。或在会议中。

sort_order = cookies[:sort_order] || 'asc' 

Patients.order("#{params[:sort]} #{sort_order}") 

cookies[:inverted_sort_order] = sort_order == 'asc' ? 'desc' : 'asc' 
-1

可以implemente一类变量这种行为,即每递增你去一个特定的动作控制器时间

#In your controller 
@@hit_number ||= 0     #This will set your hit_number the first time 
@@hit_number = @@hit_number + 1  #Increment your hit_number 

if (@@hit_number%2) == 0   #Switch for :asc or :desc 
    @my_order = :asc 
else 
    @my_order = :desc 
end 

@patients = Patients.order(name: @my_order) 

,然后在您的视图的顺序会改变每一次加载视图。

注意:这不是实现这个目标的最好方法,但它是对我来说最新的铁轨最简单的方法。

+0

说这个“不是最好的方式”是轻描淡写,它非常灰心。使用你应该使用的东西,比如会话或者Cookie。 – Iceman