如何在Rails表单中设置下拉框仅显示唯一值?代码修改咨询
解决下拉框显示唯一值的问题
嘿,这问题我熟!你只需要修改第一个下拉框的options_for_select数据源部分,给它加上去重逻辑就行。
具体修改点
原来的第一个select_tag代码是:
<%=select_tag 'domain', options_for_select(@savedHTML.collect{ |u| [u.domain, u.domain] })%>
你需要把里面的集合处理改成去重后的唯一domain列表,推荐两种写法:
- 更高效的数据库层面去重(推荐):
<%=select_tag 'domain', options_for_select(@savedHTML.pluck(:domain).uniq.map{ |d| [d, d] })%>
pluck(:domain)会直接从数据库取出所有domain字段,再用uniq去重,最后映射成下拉框需要的[显示文本, 值]格式,比加载整个对象再处理性能好很多。
- 内存层面去重(适合小数据集):
<%=select_tag 'domain', options_for_select(@savedHTML.collect{ |u| [u.domain, u.domain] }.uniq)%>
这种是先把所有domain转成下拉选项格式,再用uniq过滤重复项,适合数据量不大的场景。
修改后的完整表单片段示例
<%= form_for @domain, :url => {:controller => "page_scraper", :action => "compare"} do |f| %> <%=select_tag 'domain', options_for_select(@savedHTML.pluck(:domain).uniq.map{ |d| [d, d] })%> <%=select_tag 'version_one', options_for_select(@savedHTML.collect{ |u| [u.created_at, u.created_at] })%> <%# 这里放你剩下的表单代码 %> <% end %>
原理很简单:原来的collect会把所有的domain都列出来,包括重复的,加上.uniq之后就会自动过滤掉重复值,让下拉框只显示每个domain一次。
内容的提问来源于stack exchange,提问作者Padu
相关产品推荐
相关产品推荐

