【发布时间】:2014-01-25 00:04:18
【问题描述】:
我在 User 模型中有以下关系。
has_many :subscriptions, dependent: :destroy
has_one :subscription, -> { where 'end_date >= ?', Date.today }
:subscription 本质上是他们最新的每月订阅。 :subscriptions 是他们所有以前的每月订阅(包括最新订阅)的数组。他们列出了 start_date、end_date、user_id、plan_id、payment_method。
当订阅计划升级或降级时,我将当前订阅的 end_date 更改为 Date.today(表示订阅今天结束),然后创建一个从今天开始到一个月结束的新订阅。
将 end_date 设置为 Date.today 的问题在于 WHERE 子句将获取已取消的订阅和新的订阅。但是会支持取消的订阅,因为 SQL 查询在 ORDER BY 类上生成了主 id 升序的大头钉。
ORDER BY "subscriptions"."id" ASC LIMIT 1
对于我的一生,我无法弄清楚如何将 ID 上的 ORDER BY 从 ASC 反转为 DESC。但我更喜欢根据 created_at 时间戳订购。以下是仅用于排序的适当代码,但除了 ORDER BY 子句之外,我还必须有 WHERE 子句。
has_one :subscription, -> { order 'created_at desc' }
有没有人想出如何将两者结合起来?
【问题讨论】:
-
您是否尝试过用 ruby 而非 SQL 对其进行排序?
-
不,但如果 Rails 不允许在同一个 has_one 关系中组合 where 和 order 子句,这可能是需要的路由,这确实令人惊讶。
标签: sql ruby-on-rails ruby relationship has-one