2016-07-17 28 views
0

User.rbRuby on Rails的,隨着年齡的增長範圍內選擇用戶從活動記錄

# Attributes 
# (..) 
# birthdate (string) 
# format "mm/yyyy" 

def age 
    dob = self.birthdate.to_date 
    now = Time.now.utc.to_date 
    now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1) 
end 

在控制檯:

irb(main):002:0> current_user.age 
=> 7 

我能做到以下幾點:

age_range = "25-65" 
User.where(:age => between age_range) 

我被困在如何從年齡(班級方法)獲得價值的地方到哪裏致電

+2

如果存儲在生日作爲實際日期這會更容易得多。 –

+0

當我將用戶年齡存儲在數據庫列中時,我有可能因過期年齡 –

+0

的記錄而得到不好的結果,但我不建議這麼做,但如果您將生日作爲日期列存儲,那麼應該直接將年齡範圍轉換爲出生日期範圍 –

回答

2

首先:在數據庫中使用日期作爲出生日期的類型。

然後,你可以使用:

User.where(birthdate: 65.years.ago..25.years.ago)

如果您不能更改出生日期類型使用SQL(例如與PostrgeSQL)轉換:

User.where('to_date(birthdate, 'MM/YYYY') between ? and ?', 65.years.ago, 25.years.ago)

但你可能仍然必須糾正它,因爲你沒有確切的一天,只有一個月。

+0

非常優雅的解決方案,就像一個魅力!非常感謝! –

0

在PostgreSQL,你可以使用Rails的範圍

scope :for_age_range, -> min, max { 
    where("date_part('year', age(birthdate)) >= ? AND date_part('year', age(birthdate)) <= ?", min, max) 
} 

User.for_age_range(18, 24)