Rails命令产品价格按其最小值has_many关系递增和递减

时间:2015-08-29 23:50:25

标签: mysql sql ruby-on-rails ruby ruby-on-rails-3

我正在尝试以价格 升序降序订购我的产品,但取决于最低价格值。

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.

非常感谢您的帮助!

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排序的资源更少。