1

在我的 Rails(ActiveRecord) 应用程序中,我有一个表订阅,其中包含 3 列 created_at、duration、interval
给定一个示例

| created_at  | duration |  interval  |  
| 22-5-2013   |    1     |  month     |

我想选择 created_at 等于 (Date.today - duration.interval) 的记录 (这里是 Date.today - 1.month)
我如何使用 where 子句执行此操作?我需要使用加入同一张表吗?我没有任何线索。

4

2 回答 2

2

这里只是一个猜测,但您是否正在寻找已过期的订阅?如果是这样,我建议不要执行您的计划,而是更改您的应用程序以从一开始就存储到期日期。您可以轻松编写迁移以添加到期日期列并立即填写,然后您可以添加一个非常简单的范围来检查订阅是否已过期。

迁移:

add_column :subscriptions, :expiry_date, :datetime

Subscription.reset_column_information

Subscription.all.each do |subscription|
  duration = 0

  switch subscription.interval
    case 'year'
      duration = subscription.duration * 365
    case 'month'
      duration = subscription.duration * 30
    case 'week'
      duration = subscription.duration * 7     
  end

  subscription.update_attribute(:expiry_date, subscription.created_at + duration.days)
end

模型:

scope :expired, lambda{ where("expiry_date <= ?", Time.now) }
于 2013-05-22T15:49:40.403 回答
1

也许这对你有用(使用 PostGre SQL):

Subscription.where("CAST(created_at AS DATE) = (CURRENT_DATE - interval '1 month')")

我不能让它与列一起工作,但也许这可以给你一个开始:

Subscription
  .select("subscriptions.*, subscriptions.duration || ' ' || subscriptions.interval AS my_interval")
  .where("CAST(created_at AS DATE) = (CURRENT_DATE + interval my_interval)")

然后有很多关于在区间函数中包含变量的帖子:

啊! 让它工作(在 PostGre SQL 上):

Subscription.where("CAST(created_at AS DATE) = (CURRENT_DATE - (subscriptions.duration || ' ' || subscriptions.interval)::interval )")
于 2013-05-22T15:42:41.663 回答