如何在条件下在Rails中构建内连接?

时间:2014-12-28 15:15:27

标签: ruby-on-rails ruby-on-rails-3 postgresql pgadmin

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

您需要的是非常简单的,并且可以通过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.