如何在Rails表单下拉框中结合pluck实现字母排序
解决Rails表单下拉框按字母排序的问题
第一步:修正模型中的排序作用域
你之前的作用域写法冗余,虽然控制台能运行,但可以简化为更规范的写法:
# app/models/dance_style.rb scope :sorted, -> { order(name: :asc) }
作用域本身就在DanceStyle类的上下文里,不需要重复写DanceStyle.order,直接调用order方法即可。
第二步:在表单中正确调用作用域
你之前的尝试存在两个关键错误:
- 给
f.select传递scope: :sorted参数无效,因为f.select的第二个参数需要直接传入选项数组,而非关联查询的配置项 - 调用
pluck后再用order方法会报错,因为pluck返回的是数组,而order是ActiveRecord查询方法,必须在pluck之前执行
正确的表单代码应该先通过作用域获取排序后的记录,再提取选项数组:
<%= f.label "Dance Style", class: "form-label" %> <%= f.select :dance_styles_id_in, DanceStyle.sorted.pluck(:name, :id), { include_blank: "All dance styles" }, { class: "form-select", id: "select-dancestyle", placeholder: "Any dance style", multiple: true } %>
这里先通过DanceStyle.sorted获取按名称升序排列的所有舞蹈风格,再用pluck(:name, :id)生成[显示文本, 值]的数组,这样下拉框的选项就会按字母顺序排列了。
内容的提问来源于stack exchange,提问作者Ogarocious
相关产品推荐
相关产品推荐

