Rails 5中Product关联的Variation调用order(:name)排序失效问题
解决Product关联Variation按name排序的问题
嘿,我来帮你搞定这个变体排序的小问题!你现在的情况是产品已经按名称排好序了,但关联的变体还没按名称排序对吧?这里有几个实用的方案,你可以根据需求选:
方案一:全局设置关联默认排序(一劳永逸)
如果你的项目里所有地方需要获取Product的Variation时都按name排序,直接在Product模型里修改关联定义就行:
# app/models/product.rb class Product < ApplicationRecord has_many :variations, -> { order(:name) } end
这样不管你在控制器还是模板里调用product.variations,返回的变体都是自动按name升序排列的,模板代码完全不用改,省心又高效。
方案二:仅当前页面预加载并排序(避免N+1)
如果只是这个特定页面需要变体排序,不想影响全局关联的话,可以在控制器里用includes预加载变体,同时合并Variation的排序条件,还能避免讨厌的N+1查询:
# app/controllers/products_controller.rb def index # 替换成你实际用的action名称 @products = Product.order(:name).includes(:variations).merge(Variation.order(:name)) end
这里的merge方法会把Variation的排序规则合并到Product的查询中,预加载的变体直接就是按name排好序的,模板里依旧用原来的遍历逻辑就行,性能也更优。
方案三:模板内直接排序(不推荐)
虽然可以直接在模板里给变体加排序,但这种方式会触发额外的数据库查询(数据多了容易出现N+1问题),只适合数据量极小的场景:
<% @products.each do |product| %> <div class="grid-filter"> <% product.variations.order(:name).each do |v| %> <!-- 你的变体内容 --> <% end %> </div> <% end %>
个人更推荐前两种方案,根据你的实际业务场景选就行~
内容的提问来源于stack exchange,提问作者Charles Smith
相关产品推荐
相关产品推荐

