Как создать отдельную запись для каждого элемента в массиве
У меня есть приложение, в котором пользователь может иметь несколько друзей и создавать группы друзей. после того, как пользователь создал группу и находится на странице показа для этой группы, появляется форма, в которой отображается список друзей с флажком рядом с каждым из них. Пользователь может выбрать друзей, которые будут добавлены в группу, и при отправке будет создан элемент group_member, чтобы присоединить каждого из выбранных друзей к текущей группе.
<%= form_for @group_member, :url => {:controller => "groups", :action => 'add_member'} do |f| %>
<% @friends.each do |friend| %>
<tr>
<td><%= check_box_tag "friend_ids[]", friend.id %></td>
<td><%= friend.name + friend.id.to_s %></td>
</tr>
<% end %>
<div class="actions">
<%= f.hidden_field :group_id, :value => params[:id] %>
<%= f.submit %>
</div>
<% end %>
Похоже, это передает все параметры, необходимые для каждого group_member в контроллер
Parameters: {"utf8"=>"✓", "authenticity_token"=>"zg...Bg=", "friend_ids"=>["2", "3"], "group_member"=>{"group_id"=>"4"}, "commit"=>"Create Group member"}
но у меня возникли проблемы при разработке, как бы я написал это действие. Мне нужно перебрать элементы в массиве "friend_ids" и для каждого из них создать новый элемент GroupMember. Что-то вроде этого (надеюсь, это даст вам представление о том, что я пытаюсь сделать):
def add_member
friend_ids.each do i
@member = GroupMember.create(:group_id => params[:group_id], :friend_id => i.value)
end
end
Можно ли это сделать так, как я пытаюсь, и если да, то это даже хороший способ сделать это?
1 ответ
Измените свой код на:
def add_member
group_members_attributes = []
params[:friend_ids].each do |id|
group_members_attributes <<({ :group_id => params[:group_member][:group_id], :friend_id => id })
end
GroupMember.create group_members_attributes
end
Это создаст массив хэшей, который затем будет использоваться для массового создания всех членов GroupMembers в одной вставке базы данных, а не 1 вставка базы данных на friend_id.