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