【问题标题】:Ruby sorting using virtual columns使用虚拟列进行 Ruby 排序
【发布时间】:2013-09-24 12:44:39
【问题描述】:

我的事件表中的一列包含一列,其值为“保留”、“重要”、“待定”等。我想将查询结果返回给客户端并按此列排序,但我不想按字母顺序排序。 “重要”事件应该是第一个,“待定”第二个,等等。更重要的是,我想将整数排序值返回给客户端。

@work = Transaction.
     joins( :events ).
     where( store_id: params[:work_id] ).
     where( status: 'Open' )

【问题讨论】:

  • 这个栏目一定要加吗?你不能改用一些自定义排序算法吗?
  • 我更喜欢避免添加列。我需要的数据作为字符串存储在“状态”列中。 MySQL FIELD 函数是我的首选排序。
  • MySQL 有一个内置的CASE 语句,因此您可以使用它创建一个简单的函数,并ORDER BY 生成计算字段。您能否展示按现有列排序的当前 Ruby 代码?不了解您是如何运行 SQL 的,很难给您一个 Ruby 答案。
  • 目前,排序是按操作字段内容的字母顺序。按排序不是我想要的。也许这是提出问题的更好方法?
  • 是的,有一个更好的方法来问这个问题:将你的 Ruby 代码放入问题中。排序错误并不重要。如果太长,请尝试仅添加显着部分。当我们可以看到当前代码的结构时,引导您朝着正确的方向前进会容易得多。

标签: sql ruby transient


【解决方案1】:

你可以这样做:

@work = Transaction.
     joins(:events).
     where(store_id: params[:work_id]).
     where(status: 'Open').
     select("(case when your_column = 'Important' then '1' 
                   when your_column = 'Pending' then 2 
                   when your_column = 'Hold' then 3 else 4 end) as your_integer_column").
     order("your_integer_column")

【讨论】:

  • 谢谢,但我需要将整数值返回给客户端。
  • 谢谢,但是如何添加新列而不将其添加到表中?
  • 我不太明白你的问题。我们在这里所做的是添加一个虚拟数据库列,它实际上不是一个持久的数据库字段,而只是查询结果中的一个列。它可以在模型对象中作为属性访问,您可以像 @work.first.your_integer_column 一样访问它(获取查询返回的第一个对象的此值)。
  • 这就是我不明白的——虚拟列!谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2019-08-01
  • 2015-10-06
相关资源
最近更新 更多