获取型号名称和计数

时间:2012-11-07 19:28:11

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

我在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

非常感谢!

2 个答案:

答案 0 :(得分:1)

最后一个:

collect { |klass| klass.name }

将其重写为

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

这应该返回一个包含2个元素(classname和count)的数组。如果将分配了该变量的变量称为a,则执行以下操作:

Hash[a]

现在你可以随意使用哈希。现在你可以这样做:

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

现在你有一个哈希数组,每个哈希只有一个键值。我觉得这就是你想要的。

答案 1 :(得分: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。

Here is a live demo