我有User
模型和Group
模型。 用户
属于组
。 Group
有一个属性check_months
。
我想在用户模型中创建两个范围:old
和 fresh
。老用户是指 created_at
早于 user.group.check_minutes.ago
的用户。新用户是 created_at
比 user.group.check_minutes.ago
新的用户。
我写了范围:
scope :old, joins(:group).where("`users`.`created_at` <=
DATE_SUB(NOW(), INTERVAL `groups`.`check_minutes` MINUTE)")
scope :fresh, joins(:group).where("`users`.`created_at` >
DATE_SUB(NOW(), INTERVAL `groups`.`check_minutes` MINUTE)")
及规范:
describe "scopes" do
let(:group) {Group.make :check_minutes => 20}
let(:old_user) {User.make :group => group, :created_at => 30.minutes.ago}
let(:new_user) {User.make :group => group, :created_at => 10.minutes.ago}
context "#fresh" do
it "should scope all new users" do
User.fresh.should eq([ new_user ])
end
end
context "#old" do
it "should scope all old users" do
User.old.should eq([ old_user ])
end
end
end
规范在新
上失败(对于旧
来说没问题):
expected [#<User id: 7967, ... >]
got []
怎么了?!如何强制我的范围\规范正常工作?
如果您知道组织范围的更好方法,那就太好了!
最佳答案
你的范围没问题。
您遇到的问题是,Rails 将 UTC 时间值存储在数据库中,而不管数据库配置的时区如何,并在执行 ORM 时将它们转换为您的 (Rails) 时区。
...这意味着您的范围几乎没问题 - 您只需将“Rails”当前时间注入(inject)查询即可。
scope :old, lambda { joins(:group).where(["`users`.`created_at` <=
DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.zone.now]) }
scope :fresh, lambda { joins(:group).where(["`users`.`created_at` >
DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.zone.now]) }
关于mysql - rails : how to find all users older then n minutes ago where n is stored in joined group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948659/