Ruby on Rails - 添加按列分组的选择选项

时间:2014-11-26 02:57:13

标签: ruby-on-rails

假设我有一个包含2个字段的表:“Type”和“Name”

有没有办法可以创建一个下拉列表,显示如下内容:

Type A
    All of the db entries that have Type A
Type B
    All of the db entries with Type B

我该怎么做?我一直在查看grouped_collection_set,但这些示例似乎只是基于db关联对选项进行分组。在这种情况下,我只使用一个表,而不是两个。

2 个答案:

答案 0 :(得分:2)

创建一个类方法。

所以使用option_groups_from_collection_for_select对您没有帮助。它期望您将选项组作为一个模型,选项是另一个模型。

你想要的是grouped_options_for_select并使用类方法来生成所需的嵌套数组以实现其愿望。

继续发布您的原始问题,您需要在模型中添加以下内容:

def self.select_options_grouped_by_type
  self.uniq.pluck(:type).sort.collect do |type| 
    [ 
      type, 
      YourModel.where( type: type ).collect { |record| [ record.name, record.id ] }
    ] 
  end 
end

这将为您提供一个嵌套数组,如下所示:

[
  [ "Type A", [ 
    [ "Name 1", 1 ], 
    [ "Name 2", 2 ], 
    ... ],
  [ "Type B", [
    [ "Name 3", 3 ],
    [ "Name 4", 4 ],
    ... ],
  ]
  ...
]

然后您只需将其输入grouped_options_for_select

<%= grouped_options_for_select( YourModel.select_options_grouped_by_source ) %>

您将生成生成optgroupoption标记:

<optgroup label="Type A">
  <option value="1">Name 1</option>
  <option value="2">Name 2</option>
  <!-- ... -->
</optgroup>
<optgroup label="Type B">
  <option value="3">Name 3</option>
  <option value="4">Name 4</option>
  <!-- ... -->
</optgroup>
<!-- ... -->

一衬垫:

def self.select_options_grouped_by_type
  self.uniq.pluck(:type).sort.collect{ |type| [ type, YourModel.where( type: type ).collect{ |record| [ record.name, record.id ] } ] }
end

希望能帮助他人。

答案 1 :(得分:-1)

您可以使用:

options_from_collection_for_select(collection, value_method, text_method, selected = nil)

Documentation

然后将2个实例变量(例如@modeTypeA = Model.where(type:“A”))传递给您的视图,以便在您的集合中使用。所以可能的实现类似于:

<select>
    <%= options_from_collection_for_select(@modeTypeA, 'id', 'name') %>
</select>
<select>
   <%= options_from_collection_for_select(@modeTypeB, 'id', 'name') %>
</select>