根据哈希的出现安排哈希的唯一内容

时间:2014-02-10 00:39:29

标签: ruby ruby-on-rails-3 rails-activerecord

假设我正在触发activerecord语句,并且生成的哈希数组包含以下

我很抱歉这个模糊的问题没有提供适当的信息

在运行Item.joins(:item_categories)后确切.where(:item_categories => {:category_id => i.id})

我得到以下

[#<Item id: 1, name: "Bat", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 1, name: "Bat", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 1, name: "Bat", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 2, name: "Base", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 2, name: "Base", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 2, name: "Base", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 3, name: "Glove", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 3, name: "Glove", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 3, name: "Glove", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 4, name: "Ball", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 4, name: "Ball", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 4, name: "Ball", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 5, name: "Catchers Mitt", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 5, name: "Catchers Mitt", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 5, name: "Catchers Mitt", created_at: "2014-02-10 00:28:43", updated_at: "2014-02-10 00:28:43">, 
#<Item id: 6, name: "Batting Glove", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 6, name: "Batting Glove", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 6, name: "Batting Glove", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 7, name: "Batting Helmet", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 7, name: "Batting Helmet", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 7, name: "Batting Helmet", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 8, name: "Baseball Cap", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 8, name: "Baseball Cap", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 8, name: "Baseball Cap", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 9, name: "Gear Cycle", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 9, name: "Gear Cycle", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 10, name: "Non Gear Cycle", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 10, name: "Non Gear Cycle", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 11, name: "Mountain Bike", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 11, name: "Mountain Bike", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 12, name: "Uni-cycle", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">, 
#<Item id: 12, name: "Uni-cycle", created_at: "2014-02-10 00:28:44", updated_at: "2014-02-10 00:28:44">]

在这种情况下,我不仅希望输出是唯一的,而且还应根据出现的项ID来排列哈希:

有没有可用的方法?,我是否必须处理我的activerecord查询,还是必须编写方法来执行此操作?

3 个答案:

答案 0 :(得分:0)

假设您打算显示哈希数组而不是重复键的哈希值,您可以使用Array#uniq和块来指定唯一性标准:

array = [
  { a: 1, b: 2 }, 
  { a: 1, b: 3 },
  { a: 2, b: 1 },
  { a: 2, c: 4 }
]

array.uniq {|hash| hash[:a] } 
#=> [{ a: 1, b: 2 }, { a: 2, b: 1 }]

答案 1 :(得分:0)

哈希不能有重复的键,所以不可能这样做。请参阅文档 http://www.ruby-doc.org/core-2.1.0/Hash.html

“Hash是一个类似字典的唯一键及其值的集合。”

答案 2 :(得分:0)

如果你执行了这个:

h = {'name' => 'hank', 'name' => 'hank','name' => 'steve',
     'name' => 'brad', 'name' => 'brad','name' => 'brad' }

Ruby不会抱怨。它会将h['name']设置为'hank',然后它会再次执行此操作,然后将h['name']更改为'steve',然后将h['name']设置为'brad'三次,这样您就可以了最终会以

结束
h = { 'name' => 'brad' }

如果你更改了密钥以使它们是唯一的,那么希望每个值只出现一次并且不关心你删除了哪些键/值对来实现这一点,这里有一个简单的方法:

h = {'name1' => 'hank', 'name2' => 'hank', 'name3' => 'steve',
     'name4' => 'brad', 'name5' => 'brad', 'name6' => 'brad' }

h.invert.invert #=> {"name2"=>"hank", "name3"=>"steve", "name6"=>"brad"}