如何在有条件的 Rails 中构建内部连接



我有一个模型StockUpdate,可以跟踪商店每种产品的库存。表属性为::product_id, :stock, :store_id 。我试图找出给定商店的每个产品的最后一个条目。据此,我在下面给出的PGAdmin中构建了我的查询,它工作正常。我是Rails的新手,我不知道如何在Model中表示它。请帮忙。

SELECT  a.*
FROM    stock_updates a
    INNER JOIN
    (
        SELECT product_id, MAX(id) max_id
        FROM    stock_updates where store_id = 9 and stock > 0
        GROUP BY product_id
    ) b ON a.product_id = b.product_id AND
            a.id = b.max_id

我不清楚你想做什么,但我认为你可以做这样的事情:

class StockUpdate < ActiveRecord::Base
  scope :a_good_name, -> { joins(:product).where('store_id = ? and stock > ?', 9, 0) }
end

你们都可以调用StoclUpdate.a_good_name.explain来检查生成的sql

您需要的非常简单,可以通过 2 个查询轻松完成。否则,它在单个查询中变得非常复杂(尽管它仍然是可行的):

store_ids = [0, 9]
latest_stock_update_ids = StockUpdate.
                          where(store_id: store_ids).
                          group(:product_id).
                          maximum(:id).
                          values
StockUpdate.where(id: latest_stock_update_ids)

两个查询,无需任何joins。单个查询也可以实现相同的情况。但就像您的原始代码一样,它将包含子查询。

这样的事情应该有效:

StockUpdate.
where(store_id: store_ids).
where("stock_updates.id = (
    SELECT MAX(su.id) FROM stock_updates AS su WHERE (
      su.product_id = stock_updates.product_id
    )
  )
")

或者也许

StockUpdate.where("id IN (
  SELECT MAX(su.id) FROM stock_updates AS su GROUP BY su.product_id
)")

要回答您的原始问题,您可以手动指定一个joins,如下所示:

Model1.joins("INNER JOINS #{Model2.table_name} ON #{conditions}")
# That INNER JOINS can also be LEFT OUTER JOIN, etc.

最新更新