Spree(Rails)自定义应用:如何查询带指定属性标签的产品?
解决Spree查询关联指定属性产品的问题
嘿,我帮你排查下这个查询的问题!你当前的代码之所以返回所有关联了任意属性的产品,是因为查询条件的写法完全错了——咱们来一步步修正它。
原代码的问题
你写的where(:property_name.downcase == "rating")完全不符合ActiveRecord的查询语法:这个写法是在Ruby层面做了一个无意义的布尔判断,最终会被解析成无效的查询条件,导致所有关联了properties的产品都被返回。
正确的查询写法
因为Spree::Product和Spree::Property通过中间表关联,查询时需要明确指定关联表的字段:
- 精确匹配属性名
直接指定spree_properties表的name字段等于"Rating":
Spree::Product.joins(:properties).where(spree_properties: { name: "Rating" })
- 忽略大小写的匹配
如果需要不区分大小写(比如担心属性名存的是"rating"或者"RATING"),可以用SQL的LOWER函数:
Spree::Product.joins(:properties).where("LOWER(spree_properties.name) = ?", "rating")
- 去重处理
如果一个产品关联了多个属性,join之后可能会返回重复的产品记录,加上.distinct就能去重:
Spree::Product.joins(:properties).where(spree_properties: { name: "Rating" }).distinct
额外说明
Spree的Product和Property关联是通过Spree::ProductProperty中间表实现的,joins(:properties)会隐式关联这个中间表和spree_properties表,咱们只需要在where条件里精准定位spree_properties的name字段就可以了。
内容的提问来源于stack exchange,提问作者Grant Leslie
相关产品推荐
相关产品推荐

