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 关系升序和降序的主要内容,如果未能解决你的问题,请参考以下文章
WooCommerce:将产品作为不同的项目多次添加到购物车,但按其元数据分组