Rails 订单产品价格按其最小值 has_many 关系升序和降序

Posted

技术标签:

【中文标题】Rails 订单产品价格按其最小值 has_many 关系升序和降序【英文标题】:Rails order product price ascending and descending by their minimum value has_many relation 【发布时间】:2015-08-29 23:50:24 【问题描述】:

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

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 美元> 10 美元(最低)产品 2 然后是产品 1。

非常感谢您的帮助!

【问题讨论】:

【参考方案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 的排序更快并且使用更少的资源。

【讨论】:

嗨,我会试试这个解决方案。我必须将:minimum_price 放入attr_accessible 行吗? 不,attr_accessible 只控制实例上的属性是否可以通过传递哈希到 update_attributes 来设置,所以它完全是设置值,而不是获取它们。 好的,如果我在我的模型中使用 has_one 行,我 get wrong number of arguments (3 for 1..2) 错误。

以上是关于Rails 订单产品价格按其最小值 has_many 关系升序和降序的主要内容,如果未能解决你的问题,请参考以下文章

为 Apex 中的表单变量赋予动态值

WooCommerce:将产品作为不同的项目多次添加到购物车,但按其元数据分组

如何在 Rails 4 中显示购物车中每种产品的材料价格总和?

MS-Access 获取特定订单日期的产品价格

Rails 对象在创建时丢失参数值

将嵌套对象的值相加