我有一个模型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
答案 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.