【问题标题】:Order alphabetically, but with one value at the top按字母顺序排列,但顶部有一个值
【发布时间】:2013-07-12 08:35:21
【问题描述】:

这个:

    - book.prices.order(:currency_code).each do |price|

返回按货币代码字母顺序排列的所有图书价格:

AUD 19.99 
GBP 9.99 
NZD 26.00 
USD 14.95

现在,我怎样才能巧妙地让 GBP 始终出现在列表的顶部,而其他的按字母顺序排序,如下所示:

GBP 9.99 
AUD 19.99 
NZD 26.00 
USD 14.95

This answer 显示 SQL 解决方案,但我不确定 Rails 方式。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    由于排序通常在 DB 级别完成,因此只需使用 rails 中的 SQL 解决方案:

    - book.prices.order("`currency_code` = 'GBP' desc, currency_code").each do |price|
    

    您可以在 Rails (ActiveRecord) 查询方法中使用 sql sn-ps。
    根据您的数据库,您可能必须选择正确的 SQL 解决方案,所以可能

    - book.prices.order("CASE WHEN currency_code = 'GBP' THEN 1 ELSE 2 END, currency_code").each do |price|
    

    适用于您的情况。
    可以在rails console中查看生成的sql:

    book.prices.order("CASE WHEN currency_code = 'GBP' THEN 1 ELSE 2 END,  currency_code").to_sql
    

    并检查它是否适用于您的数据库。

    另一种方法是添加一个额外的列进行排序,这样你甚至可以将英联邦货币放在其他人的前面等。

    【讨论】:

    • 谢谢你——现在正在解析,我可以看到 SQL 解决方案实际上不起作用。我只是得到一个按字母顺序排列的列表,顶部没有英镑。
    • 尝试其他 SQL 解决方案,它们取决于 DB 品牌。我更新了我的答案。
    • 太棒了——去掉狡猾的“城市”,第二个答案效果很好。谢谢。
    • 城市被删除,(是复制粘贴留下的,抱歉)
    • 太棒了!!这对我也有帮助。 @MartinM 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多