我有一个非常典型的Rails应用,其中大量使用了CRUD。.但我们知道,它们始终与模型中的单个记录直接相关。
在我的controller#index
视图上,我希望能够允许用户以特定方式批量删除或批量更新记录。
这类似于Gmail,在Gmail中,您可以在列表中选择多封电子邮件,然后从工具栏菜单中选择change label
或move
。
在Rails中有实现该目标的模式吗?
我知道我可以使用SQL或ActiveRecord查询删除任何想要的内容。我更担心控制器和路由的外观,以及是否已经有一种模式。
答案 0 :(得分:3)
您可以在单个请求中添加用于处理多个记录(例如,帖子)操作的新路线:
进行如下更改:
# config/routes.rb
resources :posts do
collection do
put :bulk_update
delete :bulk_destroy
end
end
除了常规的CRUD路由外,还将添加以下新路由:
bulk_update_posts PUT /posts/bulk_update(.:format) posts#bulk_update
bulk_destroy_posts DELETE /posts/bulk_destroy(.:format) posts#bulk_destroy
现在,为相同的对象添加相应的控制器操作:
# app/controllers/posts_controller.rb
before_action :fetch_posts, only: [:bulk_update, :bulk_destroy]
def bulk_update
@posts.update_all(permitted_params)
redirect_to posts_path
end
def bulk_destroy
@posts.destroy_all
redirect_to posts_path
end
private
def fetch_posts
@posts = Post.where(id: params[:post_ids])
end
def permitted_params
# Decide for yourself
end
答案 1 :(得分:1)
您可以对多个记录执行各种CRUD操作,还可以在其中传递选定记录的ID的条件下,该条件将返回ActiveRecord对象的集合,并且可以对该集合执行多个更新,删除多个。
User.where(:id =>[23,45,68,123]).update_all(:is_active => true)
User.where(:id =>[23,45,68,123]).destroy_all
答案 2 :(得分:0)
您可以将ids
的列表传递到后端,然后执行User.where(id: [1,2,3]).destroy_all