【问题标题】:Generating array for grouped_options_select view helper in Rails在 Rails 中为 grouped_options_select 视图助手生成数组
【发布时间】:2014-12-18 11:53:37
【问题描述】:

我有一个具有namearea 属性的Location 模型。我想创建一个选择输入字段,我的选项在其中分组,如下所示:

<optgroup label="Area1">
   <option value=1>Location 1</option>
   <option value=2>Location 2</option>
   <option value=3>Location 3</option>
</optgroup>
<optgroup label="Area2">
   <option value=4>Location 4</option>
   <option value=5>Location 5</option>
   <option value=6>Location 6</option>
</optgroup>

我在控制器和视图中尝试了以下操作:

控制器:

@grouped_locations = Location.pluck(:area, :name).group_by(&:first).
                  map { |k, v_ary| [k, v_ary.map(&:last)] }.
                  map { |k, v_ary| [k, v_ary.map.with_index { |v, i| [v,i+1] }] }

查看:

<%= f.select :location_id grouped_options_For_select(@grouped_locations)

上面的代码给我一个带有重复值的选择字段,如下所示:

<optgroup label="Area1">
   <option value=1>Location 1</option>
   <option value=2>Location 2</option>
   <option value=3>Location 3</option>
</optgroup>
<optgroup label="Area2">
   <option value=1>Location 4</option>
   <option value=2>Location 5</option>
   <option value=3>Location 6</option>
</optgroup>

如何设置grouped_locations 数组,使值不会像第一个示例中那样重复?

【问题讨论】:

    标签: ruby arrays ruby-on-rails-4


    【解决方案1】:

    map.with_index 部分是每个区域的索引从 0 开始的位置。所以你需要跟踪索引:

    i = 0
    
    @grouped_locations = \
      Location.pluck(:area, :name).group_by(&:first).
      map{ |k, v_ary| [k, v_ary.map(&:last)] }.
      map{ |k, v_ary| [k, v_ary.map{ |v| [v, (i += 1)] }] }
    

    最后两个map 可以顺便合并成一个map

    map do |k, v_ary|
      [k, v_ary.map{ |v| [v.last, (i += 1)] }]
    end
    

    这应该可以解决问题。

    但我建议仅使用 ID 作为值,并避免使用多个 maps 迭代您的结果。

    @grouped_locations = \
      Location.pluck(:area, :id, :name).each_with_object({}) do |location, hash|
        area, id, name = location
        (hash[area] ||= []) << [name, id]
      end.to_a # remove 'to_a' if not required by 'grouped_options_for_select'
    

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 2011-12-26
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多