0

我有这个models_name

model_names = Object.constants.collect { |sym| Object.const_get(sym) }.select { |constant| constant.class == Class && constant.include?(Mongoid::Document) }.collect { |klass| klass.name }

结果是:

["Model_name1","Model_name2","Model_name3"]

我需要类似的东西:

[{"Model1":"Count"},{"Model2":"Count"},{"Model3":"Count"}]

我需要在图表中显示每个模型中的所有模型和对象计数器正在使用morris.js

你可以看看这个例子:

http://jsbin.com/uzosiq/2/embed?javascript,live

非常感谢你!

4

2 回答 2

1

最后一个:

collect { |klass| klass.name }

将其重写为

collect { |klass| [klass.name, klass.count] }

这应该返回一个包含 2 个元素(类名和计数)的数组的数组。如果分配 this 的变量称为 a,只需执行以下操作:

Hash[a]

现在您可以使用哈希值了。现在你可以这样做:

Hash[a].map do |k, v|
  {k => v}
end

现在你有一个哈希数组,每个哈希值只有一个键值关联。我认为这是你想要的。

于 2012-11-07T20:43:16.350 回答
0
module Foo

end

class Bar
  include Foo
end

1.upto(5) { Bar.new }

model_names = Object.constants.collect { |sym| Object.const_get(sym) }.
  select { |constant| constant.class == Class && constant.include?(Foo) }.
  inject({}) do |m,klass|
    m.update klass.name => ObjectSpace.each_object(klass).to_a.size
  end

p model_names

{"Bar"=>5}

仅适用于基于 MRI 的红宝石,因此没有 jRuby 和 Runbinius。

这是一个现场演示

于 2012-11-07T20:25:12.580 回答