【问题标题】:Ruby on Rails: flatten arry of hashes & group by keyRuby on Rails:按键展平哈希数组和分组
【发布时间】:2013-07-06 19:01:33
【问题描述】:

让我先解释一下我想做什么:

我有这些模型:

"Question"
name:string
belongs_to :Category

"Category"
name:string
has_many :Questions

AgendaItem
title:string
body:string
belongs_to :Category

"Meeting"
has_many :Questions
has_many :AgendaItems

这个过程是这样的: 用户创建会议并向其添加来自许多不同类别的许多问题(约 12 个类别,每个类别有 10-20 个问题)。

我已经完成了一些工作,所以我开了一个会议,上面有很多问题。

现在,当用户在名为“Finalise”的会议上执行特定操作时,我想为每个不同的 Category 创建一个 AgendaItem(使用会议的问题),AgendaItem 的 :title 应该是 Category 的 :name它的 :body 应该是在该类别下选择的所有问题

eg: <ul><li>Question1</li><li>Question2</li>...</ul>

我可以在一个讨厌的大循环中执行此操作(并检查我现在处理的问题的当前类别是否与前一个不同并创建一个新的 AgendaItem),或者使用两个循环(一个用于创建不同的 AgendaItems ,然后将问题弹出到 :body)

但我确信有更好的方法,使用数组和注入。

我当前的代码创建了一个哈希数组(我认为),如下所示:

[{:id=>1, :question=>"Question1"}, {:id=>1, :question=>"Question3"},{:id=>3, :question=>Question10}]

这是执行此操作的代码:

@meeting = Meeting.find <the_id>
array = @meeting.questions.all.map { |q| { id: q.category.id, question: q.name } }

其中 :id 是类别的 :id 而 :question 是问题的 :name

我想我想这样结束:

[{:id=>1, :question=>"<li>Question1</li><li>Question3</li>"},{:id=>3, :question=><li>Question10</li>}]

然后我可以遍历它并从 :id (key) 创建一个 AgendaItem 并将它的主体设置为 :question (value)。

【问题讨论】:

    标签: ruby-on-rails hash inject


    【解决方案1】:

    试试这个:

    questions.all.group_by(&:category_id).map { |q|
      {:id => q.first, :question => q.second.each.map { |qn| qn.name }}
    }
    #output:
    #[{:id=>1, :question=>['Question1', 'Question3']},{:id=>3, :question=>['Question10']}]
    

    【讨论】:

    • 谢谢,效果很好。所以它将不同的值 (:name) 放入一个数组中,该数组是哈希数组中键 (:category_id) 的值,对吧?
    • 我能问一下(因为我对 ruby​​ 有点陌生)q.first 和 q.second 在这里实际上是什么意思吗?他们不是指第一个和第二个问题吗?在我的示例中,单个类别中只有 3 个问题,其中 2 个问题,但一个类别中最多可能有 20 个问题
    • q.first 表示数组的第一个元素,如q[0]q.secondq[1]。而category_idcategory.id 相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2017-07-09
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多