我有許多用戶對象與created_at
屬性,例如獲取相對日期之間的對象大小
我得到的對象與@users = User.all
我想獲得與創作不同年齡的用戶對象的個數與
@users.size
這些日期範圍:
yesterday
last week
last month
last year.
我該怎麼辦它?
我用mongoid。
我有許多用戶對象與created_at
屬性,例如獲取相對日期之間的對象大小
我得到的對象與@users = User.all
我想獲得與創作不同年齡的用戶對象的個數與
@users.size
這些日期範圍:
yesterday
last week
last month
last year.
我該怎麼辦它?
我用mongoid。
你可以寫範圍爲這樣:
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
謝謝如何在我的視圖中使用這段代碼?謝謝! – hyperrjas 2012-03-16 17:46:26
@ hyperrjas ..看我的編輯。 – rubyprince 2012-03-16 17:51:21
謝謝,但如果我添加到我的模型'的塊中'17行是scope:created_yesterday, lambda {where(「users.created_at> =?」,Time.now - 1.day)}' –
hyperrjas
2012-03-16 17:56:03