【问题标题】:Query with alternating orders on ruby on rails在 ruby​​ on rails 上使用交替顺序查询
【发布时间】:2017-04-03 13:10:55
【问题描述】:

我有这段代码可以查询患者:

Patients.order(params[:sort])

我怎样才能实现这一点,以便每次执行此查询时,结果都是交替顺序,因此:(升序 -> 降序 -> 升序 -> ...)?

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

【问题讨论】:

  • 似乎不是个好主意
  • 为什么?请解释
  • 在查询中包含ascdesc 并由您自己决定您自己。如果您尝试实现在单击标题时改变方向的可排序列,则此状态将在模型/控制器层之外保持。您的视图应该使用asc/desc 提交正确的查询。

标签: sql ruby-on-rails ruby database sql-order-by


【解决方案1】:

要实现这一点,您应该在任何地方存储一些密钥,对吗?将其存储在数据库中并不是一个好主意,因为它是一个额外的 +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'

【讨论】:

    【解决方案2】:

    您可以使用类变量来实现此行为,每次您在控制器中执行特定操作时,该变量都会递增

    #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)
    

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

    注意:这不是实现这一目标的最佳方式,但在我看来,对于刚接触 Rails 的人来说,这是最简单的方式。

    【讨论】:

    • 说这“不是最好的方法”是轻描淡写的,这是非常不鼓励的。使用你应该使用的东西,比如会话或 cookie 来做这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多