私がやりたいことを説明することから始めましょう。
私はこれらのモデルを持っています:
"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 は、カテゴリの :name であり、その本文は、そのカテゴリで選択されたすべての質問である必要があります
eg: <ul><li>Question1</li><li>Question2</li>...</ul>
私は厄介な大きなループでこれを行うことができます (そして、私が取り組んでいる質問の現在のカテゴリが以前のものと異なるかどうかを確認し、新しい AgendaItem を作成します)、または 2 つのループ (1 つは個別の AgendaItem を作成し、次に1つは質問を: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 (値) に設定します。