【问题标题】:How do I create a hash of hashes inside of a .each in Ruby如何在 Ruby 中的 .each 内创建哈希哈希
【发布时间】:2013-01-10 02:39:30
【问题描述】:

我正在开发一个跟踪不同事件及其状态的 Rails 应用程序。

这是我的Status 模型:

class Status < ActiveRecord::Base
  attr_accessible :value

  has_many :events
end

有一个界面可以添加额外的状态类型。

我的Event 模型如下所示:

class Event < ActiveRecord::Base
  attr_accessible :status_id

  belongs_to :status

  class << self
    Status.all.each do |status|
      define_method(status.value.downcase) do
        send("where", :status_id => Status.find_by_value(status.value.downcase))
      end
    end
  end
end

例如,我有三个不同的状态值:OutageSlowError 等。

有了这个我可以做到:

Event.outage

或:

Event.slow

我会返回一个ActiveRecord::Relation 的所有具有该状态的事件。这按预期工作。

我有一个使用Highcharts 动态生成一些图表的视图。这是我的视图代码:

<script type="text/javascript" charset="utf-8">
  $(function () {
    new Highcharts.Chart({
        chart: { renderTo: 'events_chart' },
        title: { text: '' },
        xAxis: { type: 'datetime' },
        yAxis: {
          title: { text: 'Event Count' },
          min: 0,
          tickInterval: 1
        },
        series:[
              <% { "Events" => Event,
                   "Outages" => Event.outage, 
                   "Slowdowns" => Event.slow, 
                   "Errors" => Event.error,
                   "Restarts" => Event.restart }.each do |name, event| %>
            {
              name: "<%= name %>",
              pointInterval: <%= 1.day * 1000 %>,
              pointStart: <%= @start_date.to_time.to_i * 1000 %>,
              pointEnd: <%= @end_date.to_time.to_i * 1000 %>,
              data: <%= (@start_date..@end_date).map { |date| event.reported_on(date).count}.inspect %>
            },
            <% end %>]
          });
        });
</script>

<div id="events_chart"></div>

我想使用数据库中的Status 类型列表动态生成此哈希:

<% { 
     "Outage" => Event.outage, 
     "Slow" => Event.slow, 
     "Error" => Event.error,
     "Restart" => Event.restart }.each do |name, event|
%>

使用这样的东西:

hash = Status.all.each do |status|
  hash.merge("#{status.value}" => Event) ||= {}
end

我想在哈希上调用each 来生成我的图表。但这并没有给我一个哈希值,它给了我一个Array,就像Status.all 本身一样。

【问题讨论】:

  • 没有必要告诉我们您有多喜欢 Stack Overflow。使用它并提出问题,然后在你需要的时候回答它们,就足够了。 Stack Overflow 就像 Wikipedia 一样,其中每个问题都是一篇文章,然后是试图找到解决日常开发人员问题的答案的答案。让你的问题简洁,准确地描述你遇到的问题;考虑一下如果其他人提出问题,您需要知道的解决问题的内容,然后只输入这些内容。您的第一个问题做得很好,欢迎来到 SO!
  • 看看Hash.[]。它可以从数组中给出一个哈希值(嵌套或不嵌套)。

标签: ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

这就是我的做法,Enumerable#each_with_objectObject#send

hash = Status.select(:value).each_with_object({}) do |s, h|
  h[s.value.upcase] = Event.send s.value.downcase
end

【讨论】:

  • 太棒了!我不得不把它改成这样:|s, h|让它工作。但这解决了它。谢谢!
  • @jamesgifford 很高兴你明白了这一点。我已经编辑了答案。
猜你喜欢
  • 2011-09-20
  • 2021-02-05
  • 2011-04-20
  • 2010-09-07
  • 2013-12-20
  • 2014-03-03
  • 2021-02-03
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多