假设我有一个包含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关联对选项进行分组。在这种情况下,我只使用一个表,而不是两个。
答案 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 ) %>
您将生成生成optgroup
和option
标记:
<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)
然后将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>