如何使订单仅适用于非空记录而获取所有记录?

时间:2015-09-16 13:06:41

标签: mysql ruby-on-rails ruby rails-activerecord

我想根据条件订购结果。

例如

@redeemables = @business.redeemables.order(expiry_date: :desc)

我希望所有可兑换成expiry_date => nil的首先是可兑换订单而非desc

在其他方面,具有exipry_date < Date.current的可兑换项应该在订单的底部。

我怎么能这样做?感谢

4 个答案:

答案 0 :(得分:2)

如果您正在使用PostgreSQL,那就是NULLS FIRST(vs. NULLS LAST)语句,但是这样做是标准的SQL方法({{ 1}}基本上总能工作),因为CASE会触发急切的加载,你可能不想发生这种加载。

relation + relation

答案 1 :(得分:2)

获得所需内容的最简单方法是:

@redeemables = @business.redeemables.order("-expiry_date asc")
  • 这将为您提供(expiry_date:asc)的反向结果
  • 这意味着降序由expiry_date排序,首先为null

答案 2 :(得分:0)

您可以这样做:

@redeemables_without_expiry = @business.redeemables.where("expiry_date IS NULL")
@redeemables_with_expiry = @business.redeemables.where("expiry_date IS NOT NULL").order(expiry_date: :desc)

@redeemables = @redeemables_without_expiry + @redeemables_with_expiry

答案 3 :(得分:0)

尝试这样的事情:

@redeemables = @business.redeemables.sort_by {|r| "#{r.expiry_date.blank?} #{r.desc}" }

它基本上做的是通过一个串联字符串排序,该字符串是否有效期(true / false)和描述。 (例如false item_description)。

如果您想更改零expiry_dates的排序顺序,可以执行以下操作:

@redeemables = @business.redeemables.sort_by {|r| "#{r.expiry_date.present?} #{r.desc}" }