1

让我首先解释我想要做什么:

我有这些模型:

"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 和:它的主体应该是在该类别下选择的所有问题

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

我可以在一个讨厌的大循环中执行此操作(并检查我所处理的问题的当前类别现在是否与前一个不同并创建一个新的议程项目),或者使用两个循环(一个创建不同的议程项目,然后一个将问题弹出到: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 (键)创建一个 AgendaItem 并将其主体设置为 :question (值)。

4

1 回答 1

0

试试这个:

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']}]
于 2013-07-09T11:04:42.527 回答