2013-05-22 42 views
1

的另一列在我的Rails(ActiveRecord的)應用程序檢查欄,我有3列created_at,持續時間,間隔
給出的例子導軌 - 與同桌

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

我想選擇記錄表預訂其中created_at等於(Date.today - duration.interval)(這裏Date.today - 1.month)
我怎樣才能做到這一點與where子句? 我需要使用連接相同的表嗎? 我沒有任何線索。

+0

你想這樣做,作爲驗證保存記錄之前?爲什麼是where子句? – cortex

+0

@cortex我想選擇created_at是1個月前的記錄(或3年前或2周前).interval可以是周,月或年。 – shajin

回答

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) } 
+0

我欣賞這一點,我會用這個方法。但爲了讓我開心,有沒有辦法以我的方式做到這一點? – shajin

+1

我很高興能幫上忙! @MrYoshiji在下面給出了一個使用SQL進行建議的建議。 – Matt

+0

我的解決方案適用於PostGres,我不知道MySQL。另外,lambda在這裏不是必需的(lambda需要一個參數):'scope:expired,where(「expiry_date <=?」,Time.now)'就夠了,或者用lambda更好:'scope:expired, lambda {| date | where(「expiry_date <=?」,date.try(:to_date)|| Date.today)}'然後用'Subscription.expired'或'Subscription.expired('2012-12-12')'獲得在今天或其他日期的過期訂閱 – MrYoshiji

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)") 
+0

我無法將其轉換爲mysql。更好的是我使用了Matt的方法 – shajin

+1

在MySQL中可能有相當的功能,但@Matt的答案是達到同樣目的的好方法。 – MrYoshiji