2012-03-16 68 views
1

我有許多用戶對象與created_at屬性,例如獲取相對日期之間的對象大小

我得到的對象與@users = User.all

我想獲得與創作不同年齡的用戶對象的個數與

@users.size 

這些日期範圍:

yesterday 
last week 
last month 
last year. 

我該怎麼辦它?

我用mongoid。

回答

2

你可以寫範圍爲這樣:

class User 
    include Mongoid::Document 
    ... 

    ## Scopes for calculating relative users 
    scope :created_yesterday, lambda { where(:created_at.gte => (Time.now - 1.day)) } 
    scope :created_last_week, lambda { where(:created_at.gte => (Time.now - 1.week)) } 
    scope :created_last_month, lambda { where(:created_at.gte => (Time.now - 1.month)) } 
    scope :created_last_year, lambda { where(:created_at.gte => (Time.now - 1.year)) } 
    ... 
end 

,我們需要在這裏使用lambda的原因是,它的延遲參數Time.now的評價時,範圍實際上是調用。如果沒有lambda表達式,那麼在查詢邏輯中使用的時間將是該類首次被評估的時間,而不是範圍本身。

現在我們可以計數,通過簡單地調用:

User.created_yesterday.count 
User.created_last_week.count 
... 

如果你想要的對象:

@users_created_yesterday = User.created_yesterday 

您可以在視圖使用@users_created_yesterday

更新

那麼昨天,如果你的意思之間,昨天開始時間0:00日23:59前日結束,你將不得不採取的時區考慮在內。

佛例如,在你的application.rb中,如果你寫:

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. 
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. 
config.time_zone = 'Central Time (US & Canada)' 

如果你有使用,通過ActiveRecord的查詢獲取的任何時候都將被轉換爲這個時區,中部時間(美國&加拿大)。在數據庫中,所有時間都將以UTC存儲,並將從數據庫中提取時轉換爲時區。如果您已將該行註釋掉,則默認值爲UTC。您可以使用耙子任務rake time:zones:all或僅使用rake time:zones:us的美國時區獲取所有時區。

如果您想要在application.rb中指定的時區,則需要在以下代碼中使用Time.zone.now。如果您在以下代碼中使用Time.now,則將根據服務器計算機的時區獲取時區。

class User 
    include Mongoid::Document 
    ... 
    scope :created_between, lambda { |start_time, end_time| where(:created_at => (start_time...end_time)) } 

    class << self 
    ## Class methods for calculating relative users 
    def created_yesterday 
     yesterday = Time.zone.now - 1.day 
     created_between(yesterday.beginning_of_day, yesterday.end_of_day) 
    end 

    def created_last_week 
     start_time = (Time.zone.now - 1.week).beginning_of_day 
     end_time = Time.zone.now 
     created_between(start_time, end_time) 
    end 

    def created_last_month 
     start_time = (Time.zone.now - 1.month).beginning_of_day 
     end_time = Time.zone.now 
     created_between(start_time, end_time) 
    end 

    def created_last_year 
     start_time = (Time.zone.now - 1.year).beginning_of_day 
     end_time = Time.zone.now 
     created_between(start_time, end_time) 
    end 
    end 

    .. 
    .. 
end 

所以,你可以寫類的方法和計算開始時間和結束時間,將其提供給範圍created_between,你就可以打電話給他們像User.created_yesterday,就像我們之前調用。

現金EdgeRails。既然是Mongoid,我不得不擡頭看看Mongoid docs

+0

謝謝如何在我的視圖中使用這段代碼?謝謝! – hyperrjas 2012-03-16 17:46:26

+0

@ hyperrjas ..看我的編輯。 – rubyprince 2012-03-16 17:51:21

+0

謝謝,但如果我添加到我的模型'的塊中'17行是scope:created_yesterday, lambda {where(「users.created_at> =?」,Time.now - 1.day)}' – hyperrjas 2012-03-16 17:56:03