代码之家  ›  专栏  ›  技术社区  ›  anonn023432

`中的属性引用不一致?`轨道中的方法

  •  0
  • anonn023432  · 技术社区  · 6 年前

    这是我的 User 模型:

    class User
      def upcoming_events_in(minutes, client_id)
        events.where(client_id: client_id).exists?(start: (Time.zone.now - duration)..(Time.zone.now + minutes))
      end
    end
    

    在方法中 upcoming_events_in ,它正确地寻找 start 属性 events 记录,但它试图寻找 duration 用户 实例。有办法把它和 事件 实例?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Aleksei Matiushkin    6 年前

    我不知道 Rails 但它可以很容易地用普通的、老的、好的SQL执行:

    def upcoming_events_in(minutes, client_id)
      events.
        where(client_id: client_id).
        where('DATEDIFF(events.start, DATESUB(NOW(), INTERVAL events.duration MINUTES)) > 0').
        where('DATEDIFF(events.start, DATEADD(NOW(), INTERVAL events.minutes MINUTES)) < 0').
        exists?
    end
    

    《PostgreSQL》 版本:

    def upcoming_events_in(minutes, client_id)
      start = "(TIMESTAMP events.start, TIMESTAMP events.start + INTERVAL '1 MINUTE')"
      interval = "(NOW() - INTERVAL 'events.duration MINUTES', NOW() + INTERVAL 'events.minutes MINUTES')"
    
      events.
        where(client_id: client_id).
        where("#{start} OVERLAPS #{interval}").
        exists?
    end
    

    或者说,我没有PG需要检查。