0

MongoDB を使用するときにオプションをグループ化する最良の方法は何ですか?

このアプローチを試したとき、私はMongoidを使用しています:

<%= field.select :resource_id, 
    grouped_options_for_select(Resource.all.group_by{"resource_type_id"}.map {|k,m|
    [m.first.title, m.first.id] }),:prompt => true %>

次のエラーが表示されます。

"5177e6a5359f105f89000001":Moped::BSON::ObjectId の未定義のメソッド `map'

私が探している間:

<select>
    <optgroup label="RT1">   <!-- RT1 is the name of resource type -->
        <option value="5177e6a5359f105f89000001">Res1</option>
    </optgroup>
</select>

また、コンソールの出力Resource.all.group_by{"resource_type_id"}

=> {"resource_type"=>[#<Resource _id: 5177e6a5359f105f89000001, 
created_at: 2013-04-24 14:05:25 UTC, updated_at: 2013-04-24 14:54:14 UTC,
title: {"en"=>"Res1"}, slug: {"en"=>"res1"}, content: 
{"en"=>"This is the content for First Resource."},
excerpt: {"en"=>"This is the content for First Resource."}, published: true,
resource_type_id: "5177e3ba359f10d345000004">]}

期待される結果は

=> {"RT1"=>[#<Resource _id: 5177e6a5359f105f89000001, 
created_at: 2013-04-24 14:05:25 UTC, updated_at: 2013-04-24 14:54:14 UTC,
title: {"en"=>"Res1"}, slug: {"en"=>"res1"}, content: 
{"en"=>"This is the content for First Resource."},
excerpt: {"en"=>"This is the content for First Resource."}, published: true,
resource_type_id: "5177e3ba359f10d345000004">]}
4

4 に答える 4

0

以下は optgroup の例です。

 @city_group =
                 [
                 ["Wisoncin", [["Lake Geneva", "1"], 
                 ["Elkhart Lake", "2"]]],
                 ["Michigan", [["Harbor Country", "3"], ["Traverse City", "4"]]],
                 ["Indiana", [["Bloomington", "5"], ["Valparaiso", "6"]]],
                 ["Minnesota", [["Twin Cities", 
                 "7"], ["Bloomington", "8"], ["Stillwater", 
                 "9"]]],
                 ["Florida", [["Sanibel & Captiva", "10"]]],
                 ["Illinois", [["Chicago", "11"], 
                 ["Galena", "12"]]],
                 ]

そしてあなたの見解でこれを追加してください:

<%= select_tag(:brand_id, grouped_options_for_select(@city_group, selected_key = "11", prompt = nil)) %>

それが役に立てば幸い!楽しみ!

于 2013-05-03T04:05:24.960 に答える
0

Old Pro が言及したアプローチは素晴らしいですが、予想より少し長くなります。grouped_collection_select私はhelper docsにある例に時間を費やしましたが、その要点は次のとおりです。ORM オブジェクトとは対照的に、関係のないカスタムのネストされた配列を扱うことになるため、他の方法は混乱を招きます。

したがって、私の目的の出力は、ERB の次の Ruby (1 行) コードによって生成できます。

<%= field.grouped_collection_select :resource_id, ResourceType.order_by([:name,:asc]), 
    :resources, :name, :id, :title,  :prompt => true %>

..where:resources:nameResourceType に属し、:id:titleResourceのオプション用です。

それが他の人にも役立つことを願っています。

于 2013-04-30T08:11:26.760 に答える
-1

resource_typeオプションをではなく でグループ化することを想定していますresource_type_id

f.grouped_collection_select :resource_id, 
                            Resource.all.group_by(:resource_type).to_a, 
                            :last, :first, :id, :name

説明:

  • Resource.all.group_by(:resource_type).to_a配列の配列を返します。

    [
      [ "R1", [<Resource _id 51xx0001>, <Resource _id 51xx0002>]],
      [ "R2", [<Resource _id 51xx0003>, <Resource _id 51xx0004>]]
    ]
    
  • last手順 1 で返された配列の各行でのメソッド呼び出しは、Resource オブジェクトの配列を返します。

  • first手順 1 で返された配列の各行でのメソッド呼び出しは、リソース タイプ名を返します。
  • 手順 2 で返された配列の各行でidandメソッドを呼び出すと、リソース オブジェクトの ID と名前が返されます。name
于 2013-04-26T21:06:19.973 に答える