0

在视图中有一个下拉菜单集合(使用简单的表单 gem):

<%= f.input :item, :collection => MyModel::CATEGORY %>

该集合填充在我的模型中:

CATEGORY = [["Category", 5], ["Another", 4], ["This", 3], ["That", 2], ["Foo", 1]]

我不想重新创建它,而是想在我的控制器中使用它:

@category = []
@category << ProductDevelopment::CATEGORY

我真正想要的是一个这样填充的数组:

@category[1] = "Foo"
@category[2] = "That"
@category[3] = "This"
@category[4] = "Another"
@category[5] = "Category"

搜索但似乎无法找到正确的语法来执行此操作。谢谢你的帮助。

4

4 回答 4

2
@category = MyModel::CATEGORY.sort{|x,y| x[1] <=> y[1]}.map{|c| c[0]}

sort部分只是根据与它们关联的数字对您的类别进行排序,然后map创建一个仅包含类别名称的新数组。

于 2013-08-03T19:49:14.870 回答
1

我建议你不要这样做。使用像这样的枚举 gem:https ://www.ruby-toolbox.com/categories/Active_Record_Enumerations IMO 更具可测试性、可重用性和可维护性。

于 2013-08-03T19:17:30.713 回答
1

给定元素CATEGORIES = [ ['a', 1], ['b', 2], ... ]任何顺序表示带有元素的类别的项目[category, index],您有两种数据结构可供选择。

  1. Array您可以按索引查找类别的地方

    小心这个选择。因为你必须有一个0索引,你需要开箱即用。

    # Mix things up for kicks
    categories = CATEGORIES.shuffle
    
    categories.inject([]){|memo,cat|  memo[cat[1]] = cat[0]; memo }
    # => [nil, 'a', 'b']
    

    nil如果您选择删除类别,您还需要担心条目。说你删除['d', 4]. 您现在会看到以下内容:

    # => [nil, 'a', 'b', 'c', nil, 'e', ...]
    
  2. 一个Hash可以按键查找类别的地方

    nil这将避免在使用数组时出现值的整个问题:

    # Mix things up for kicks
    categories = CATEGORIES.shuffle
    categories.inject({}){ |memo,cat| memo.merge!({cat[1]=>cat[0]}) }
    # => {2=>'a', 1=>'b'}
    

我个人推荐Hash,据我所知,在大多数 Rails 表单构建器中,哈希与集合配合得很好。

于 2013-08-03T19:54:30.730 回答
0
@category = MyModel::CATEGORY.map{ |arr| arr[0] }

**未经测试

于 2013-08-03T19:12:14.750 回答