我正在尝试以价格 升序和降序来订购我的产品,但取决于最低价格值。
products `has_many` product_prices through product_offers.
我正在使用@products.includes(:product_offers).includes(:product_prices).where(...).order("product_prices.price ASC")
或DESC
铁路的功能,但我需要订购最低价格的产品。然后我想像这样循环:
<% for @product in @products %>
<%=@product.product_prices.minimum("price").first%>
<% end %>
这就是为什么@products
必须有正确的顺序。它总是给我相同的订单。我究竟做错了什么?问题是,假设产品1的价格范围为10美元 - 50美元,产品2的价格范围为20美元 - 40美元。如果我使用订单ASC
功能,它将显示产品1然后产品2.如果我使用订单DESC
功能,它将显示产品1然后产品2,因为50 $> 40 $,但是什么我想要的是20 $&gt; 10 $(最低)产品2,然后是产品1.
非常感谢您的帮助!
答案 0 :(得分:1)
我建议在product_prices中添加一个范围,以确定该产品的最低价格。
def self.minimum_for_product
where("product_prices.price = (select min(pp.price)
from product_prices pp
where pp.product_id = product_prices.product_id")
end
然后您可以在Product中定义:
has_one :minimum_price, -> {merge(ProductPrice.minimum_for_product)}, :class_name => "ProductPrice"
这将让你:
ProductPrice.join(:minimum_price).
references(:minimum_price).
order("product_prices.price")
因此,最小价格和订单或产品的识别是在单个SQL语句中执行的,这将更快,并且使用基于Rails排序的资源更少。