【问题标题】:Using multiple tables in Rails scope query在 Rails 范围查询中使用多个表
【发布时间】:2021-07-02 13:57:56
【问题描述】:

在我的购物车模型中,它有_many Subcarts 和belongs_to Locations,我正在尝试创建一个范围查询,在该查询中,我获取所有具有子购物车的购物车,这些购物车的 created_at 时间戳超出购物车的特定时间量。位置.active_minutes。我在尝试找到在查询中使用 location.active_minutes 的方法时遇到问题。我不断收到未定义的表错误。

这基本上是我目前所拥有的。

scope :inactive_cart_bucket, -> {
  where('EXISTS (SELECT s.cart_id FROM cart_subcarts s WHERE (s.cart_id = cart.id) AND (? - s.created_at) / 3600 > cart.location.active_minutes)', Time.zone.now.utc)
}

【问题讨论】:

    标签: ruby-on-rails postgresql rails-activerecord


    【解决方案1】:

    您必须访问locations 表,也许通过您在购物车模型中的belongs_to 关系加入它:

    scope :inactive_cart_bucket, -> {
      joins(:location).where(
        "EXISTS (
          SELECT s.cart_id
          FROM cart_subcarts s
          WHERE (s.cart_id = cart.id)
          AND ((? - s.created_at) / 3600) > locations.active_minutes
        )",
        Time.zone.now.utc
      )
    }
    

    请注意,这是一个 INNER JOIN,根据您要执行的操作,您可能需要一个不同的。

    【讨论】:

    • 我不是 PostgreSQL 专家,但似乎时间戳 - 时间戳提供了一个间隔,除以 3600 整数似乎没有将其更改为分钟之间的预期效果。似乎(基于一些谷歌搜索)适当的方法是AND EXTRACT(EPOCH FROM (? - s.created_at))/60 > locations.active_minutes
    • 是的,我也不是,这就是为什么我只是添加了一些更改来回答这个问题,但对 OP 了解它有好处。谢谢@engineersmnky ;)
    • 我正要回到这里询问这个问题。谢谢!有没有办法根据最新的子购物车获取购物车?
    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多