ruby-on-rails 这个SQL的Ruby ActiveRecord等价物是什么?

o4hqfura  于 2023-03-31  发布在  Ruby
关注(0)|答案(1)|浏览(127)

Ruby中的优化(快速)ActiveRecord等价物是什么:

SELECT DISTINCT customers.city 
FROM customers
INNER JOIN (
  SELECT c_id 
  FROM carts
  WHERE shop_id = #{`shop_id`}
  ORDER BY created_at DESC 
  LIMIT 1000 OFFSET 1000
) AS filtered_carts ON customers.id = filtered_carts.c_id;

注意:shop_id是传递给查询/关联的ruby变量。谢谢
上面的SQL运行得和预期的一样快。
我试图找到一个纯粹的ActiveRecord解决方案来避免类似这样的事情:

customers = Customer
  .select(:city)
  .distinct
  .joins("
    INNER JOIN (
      SELECT c_id
      FROM carts
      WHERE shop_id = #{`shop_id`}
      ORDER BY created_at DESC
      LIMIT 1000 OFFSET 1000
    ) AS filtered_carts
    ON customers.id = filtered_carts.c_id
  ")

原因是为了避免在ActiveRecord中硬编码SQL,以防止未来可能出现的最终模型更改和迁移的向后兼容性问题。

utugiqy6

utugiqy61#

我认为你根本不需要JOINwhere中的子查询应该足够了:

customer_ids = 
  Cart
    .select(:c_id)
    .where(shop_id: shop_id)
    .order(:created_at)
    .limit(1000)
    .offset(1000)

Customer
  .where(id: customer_ids)
  .distinct
  .pluck(:city)

请注意,customer_ids只是一个ActiveRecord::Relation,并且该查询不会立即运行。它只会在执行第二个查询时作为子查询运行。

相关问题