我有一个应用程序,用户可以拥有多个朋友,并可以创建朋友组。在用户使用frist创建了一个组并且在该组的显示页面上之后,有一个表单显示了一个朋友列表,每个朋友旁边都有一个复选框。用户可以选择将添加到组中的朋友,并且在提交时,将创建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
这可以按照我正在尝试的方式完成,如果是这样,即使这样做也很好吗?
答案 0 :(得分:2)
将您的代码更改为:
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,而不是每个friend_id有1个数据库插入。