Ruby on Rails: массив для хэширования (ключ, массив значений) - PullRequest
2 голосов
/ 30 ноября 2010

Допустим, у меня есть Массив content_categories (content_categories = user.content_categories)

Теперь я хочу добавить каждый элемент, принадлежащий к определенной категории, в content_categories с категорией в качестве ключа и элементом content-itemИдентификаторы как элементы набора

В PHP возможно что-то подобное:

foreach ($content_categories as $key => $category) {
  $contentsByCategoryIDArray = Category.getContents($category[id])  
  $content_categories[$key][$contentsByCategoryIDArray]
}

Есть ли в рельсах простой способ сделать это?

Привет,

Нико

Ответы [ 7 ]

4 голосов
/ 01 декабря 2010

Ваш вопрос на самом деле не вопрос Rails, это общий вопрос программирования на Ruby.

Ваше описание не очень понятно, но насколько я понимаю, вы хотите сгруппировать идентификаторы для общих категорий, используя хэш. Существуют различные другие способы сделать это, но это легко понять: *

ary = [
  'cat1', {:id => 1},
  'cat2', {:id => 2},
  'cat1', {:id => 3}
]

hsh = {}
ary.each_slice(2) { |a| 
  key,category = a
  hsh[key] ? hsh[key] << category[:id] : hsh[key] = [category[:id]]
}
hsh # => {"cat1"=>[1, 3], "cat2"=>[2]}

Я использую простой массив с категорией, за которым следует простой хеш, представляющий некоторый экземпляр объекта, потому что он облегчает визуализацию. Если у вас есть более сложный объект, замените записи хеша этими объектами и настройте способ доступа к идентификатору в троичной (?:) строке.

Использование Enumerable.inject ():

hsh = ary.each_slice(2).inject({}) { |h,a| 
  key,category = a
  h[key] ? h[key] << category[:id] : h[key] = [category[:id]]
  h 
}
hsh # => {"cat1"=>[1, 3], "cat2"=>[2]}

Enumerable.group_by(), возможно, может уменьшить его еще больше, но мой мозг угасает.

3 голосов
/ 30 ноября 2010

Я бы использовал Enumerable # inject

content_categories = content_categories_array.inject({}){ |memo, category| memo[category] = Category.get_contents(category); memo }
2 голосов
/ 30 ноября 2010
Hash[content_categories.map{|cat|
  [cat, Category.get_contents(cat)]
}]
1 голос
/ 01 декабря 2010

Не совсем правильный ответ, потому что вы хотите идентификаторы в вашем массиве, но я все равно выкладываю его, потому что он хороший и короткий, и вы можете сойти с рук:

content_categories.group_by(&:category)
0 голосов
/ 02 декабря 2010

Для этого решения content_categories должен быть хешем, а не массивом, как вы описываете. В противном случае не уверен, где вы получаете ключ.

contents_by_categories = Hash[*content_categories.map{|k, v| [k, Category.getContents(v.id)]}]
0 голосов
/ 30 ноября 2010

Если я правильно понимаю, content_categories - это массив категорий, который необходимо превратить в хэш категорий и их элементов.

content_categories_array = content_categories
content_categories_hash = {}
content_categories_array.each do |category| 
  content_categories_hash[category] = Category.get_contents(category)
end
content_categories = content_categories_hash

Это длинная версия, которую вы также можете написать как

content_categories = {}.tap do |hash|
  content_categories.each { |category| hash[category] = Category.get_contents(category) }
end 
0 голосов
/ 30 ноября 2010
content_categories.each do |k,v|
  content_categories[k] = Category.getContents(v)
end

Полагаю, это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...