mysql - rails : how to find all users older then n minutes ago where n is stored in joined group

标签 mysql ruby-on-rails datetime rspec scope

我有User模型和Group模型。 用户属于Group 有一个属性check_months

我想在用户模型中创建两个范围:oldfresh。老用户是指 created_at 早于 user.group.check_minutes.ago 的用户。新用户是 created_atuser.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/

相关文章:

MySQL 比较现有记录

ruby-on-rails - Puma shoes 所有请求都来自 127.0.0.1 在 nginx 之后

c# - 将 Stack Overflow 中的非标准日期字符串解析为 .NET DateTime

php - 在 MySQL 中舍入 float 而不是整数

PHP/MySQL - 同时进行多个查询

MySQL查询问题。最后一个月的日期

ruby-on-rails - 如何在 rails 3.2.13 和 rails 4.0.0 之间切换?

ruby-on-rails - SASS 不会在 Sublime Text 2 中构建 [Errno 2] No such File or Directory

c++ - boost::posix_time::ptime 到 UTC8601?

mysql - 如何从当前时间戳中减去秒数