Помимо базового CRUD, как пользователи могут обновлять или удалять множество записей?

У меня есть очень типичное приложение Rails с активным использованием CRUD... но, как мы знаем, они всегда напрямую связаны с одной записью в модели.

Обновить многие: например, «Отметить выбранное как заархивированное»

В моем представлении controller#index я хочу, чтобы пользователи могли массово удалять или массово обновлять записи определенным образом.

Это похоже на Gmail, где вы можете выбрать несколько писем в списке и выбрать change label или move в меню панели инструментов.

Есть ли шаблон для достижения этого в Rails?

введите здесь описание изображения

Я знаю, что могу удалить все, что захочу, используя запросы SQL или ActiveRecord. Меня больше беспокоит то, как должны выглядеть контроллер и маршруты, и есть ли уже шаблон для этого.


person Turgs    schedule 29.06.2018    source источник


Ответы (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
person Jagdeep Singh    schedule 29.06.2018

Вы можете выполнять различные операции CRUD с несколькими записями, также когда вы передаете идентификаторы выбранной записи, в которой условие возвращает коллекцию объектов ActiveRecord, и в этой коллекции вы можете выполнить обновление нескольких, удалить несколько.

User.where(:id =>[23,45,68,123]).update_all(:is_active => true)
User.where(:id =>[23,45,68,123]).destroy_all
person Sandeep Garg    schedule 29.06.2018

Вы можете передать список ids серверной части, а затем выполнить User.where(id: [1,2,3]).destroy_all

person Subash    schedule 29.06.2018
comment
Меня больше беспокоит то, как должны выглядеть контроллер и маршруты, и есть ли уже шаблон для этого. Я знаю, что могу удалить все, что захочу, используя запросы SQL или ActiveRecord. Я поясню это в своем вопросе. - person Turgs; 29.06.2018