【问题标题】:activerecord exists subqueryactiverecord 存在子查询
【发布时间】:2015-04-01 03:41:36
【问题描述】:

我有以下两种型号:

class Client < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
  belongs_to :client
end

我想查询一个列表中指定的订单(order_1,order_2)的客户,同时需要客户的所有订单。我可以通过下面的 SQL 做到这一点:

SELECT *
FROM CLIENTS C
JOIN ORDERS O
ON C.ID = O.CLIENT_ID
WHERE EXISTS
  (SELECT *
  FROM CLIENTS C1
  JOIN ORDERS O1
  ON C1.ID = O1.CLIENT_ID
  WHERE O1.ID IN ('order_1', 'order_2')
  AND C1.ID = C.ID
  );

有什么办法可以用rails的方式做到这一点吗?下面的代码会给满意的客户,但 client.orders 只返回指定的订单。

clients.includes(:orders).where(orders: { id: ['order_1', 'order_2'] })

我不知道如何在一个查询中获取所有信息。

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我知道这是几年后的事,但这里是如何做到的(基于this blog post)。

    Order.where(client_id:
      Client.joins(:orders)
        .where(orders: {id: ['order_1', 'order_2']})
        .select(:id)
    )
    

    【讨论】:

      【解决方案2】:

      可以做到这一点的宝石:activerecord_where_assoc(我是作者)

      有了它,你可以用这种方式做你想做的事:

      clients.includes(:orders).where_assoc_exists(:orders, id: ['order_1', 'order_2'])
      

      在没有 gem 的情况下执行此操作很容易出错或产生烦人的副作用,例如您提到的没有所有记录的副作用。这是关于the problems 的完整文档。

      documentation 中了解更多信息。这是introductionexamples

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多