在rails activerecord样式中编写嵌套查询

chi*_*ain 1 ruby activerecord ruby-on-rails

如何以rails活动记录样式编写此查询

SELECT COUNT(o.id) no_of_orders, 
       SUM(o.total) total, 
       SUM(o.shipping) shipping 
  FROM orders o JOIN 
(
    SELECT DISTINCT order_id
      FROM designer_orders
     WHERE state IN('pending', 'dispatched', 'completed')
) d 
    ON o.id = d.order_id
Run Code Online (Sandbox Code Playgroud)

dam*_*ser 7

你可以使用显式查询,你有2种方式来做到这一点:

Model.where("MYSQL_QUERY")
Run Code Online (Sandbox Code Playgroud)

要么

Model.find_by_sql("MYSQL_QUERY")
Run Code Online (Sandbox Code Playgroud)

http://apidock.com/rails/ActiveRecord/Base/find_by_sql/class

要么

在Rails样式中有更多步骤(可能用更少的时间完成):

order_ids = DesignerOrder.where("state IN (?)", ['pending', 'dispatched', 'completed']).select(:order_id).distinct

partial_result = Order.where("id IN (?)", order_ids)

no_of_orders = partial_result.count
total_sum = partial_result.sum(:total)
shipping_sum = partial_result.sum(:shipping)
Run Code Online (Sandbox Code Playgroud)

  • 我希望有更好的方法来写这个. (2认同)

bri*_*ver 5

你也可以这样做

Order
  .select('
    COUNT(o.id) no_of_orders, 
    SUM(o.total) total, 
    SUM(o.shipping) shipping
  ')
  .from('orders o')
  .joins("
    (#{
      DesignerOrders
        .select("DISTINCT order_id")
        .where("state IN('pending', 'dispatched', 'completed')")
    }) d on o.id = d.order_id
  ")
Run Code Online (Sandbox Code Playgroud)

我实际上没有运行它,但这个概念是有效的.如果使用"from",则甚至不需要活动记录模型.我们使用这样的技术为非常复杂的SQL进行AR样式查询,这让我们的生活变得更加轻松.