以下作品,但我想知道是否有更好的方法?在索引页面上,我们列出了小部件。您可以在其显示视图中编辑每个窗口小部件,但为了提高效率,我们希望通过向每个窗口小部件添加一个复选框,让用户能够从索引页面执行批量操作,然后收集选定的窗口小部件,将它们传递给控制器和'做东西'他们从控制器中一举失败。这是代码......
<%= form_tag bulk_change_widgets_path(method: :post) do %>
<%- @widgets.each do |image| -%>
....
<%= check_box_tag 'selected_widget_ids[]', widget.id -%>
</td>
</tr>
<%- end -%>
<%= submit_tag %>
<%- end -%>
action_one
@widget = Widget.find(params[:id])
...
end
action_two
@widget = Widget.find(params[:id])
...
end
def bulk_change_widgets
selected_widgets = params[:selected_widget_ids]
selected_widgets.each do |widget|
params[:id] = widget
action_one
action_tow
end
redirect_to widgets_path
end
action_one / two的现有结构需要保留在适当的位置,以容纳从每个窗口小部件的显示页面调用的实例方法。但是,在同一个控制器中以这种方式调用action_one / 2时,某些事情并没有感觉。有没有更好的,或 Rails方式来做到这一点?
答案 0 :(得分:1)
这可能更有效率。不是多个查询来单独获取小部件,而是执行单个查询以获取所有小部件并使用此列表进行迭代。如果它太多的小部件ID并将它们加载到内存中是一个问题(我不认为是这种情况),你可以做find_each
def bulk_change_widgets
selected_widgets = Widget.where(:id => params[:selected_widget_ids])
selected_widgets.each do |widget|
widget.take_action
end
redirect_to widgets_path
end
并且,正如评论所说,将方法移动到Widget类(胖模型,瘦控制器)。