Помимо базового CRUD, как пользователи могут обновлять или удалять много записей? - PullRequest
0 голосов
/ 29 июня 2018

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

Обновить многие: то есть "Пометить как выбранное в архиве"

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

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

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

enter image description here

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

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

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

User.where(:id =>[23,45,68,123]).update_all(:is_active => true)
User.where(:id =>[23,45,68,123]).destroy_all
0 голосов
/ 29 июня 2018

Вы можете добавить новые маршруты для обработки действий над несколькими записями (скажем, сообщениями) в одном запросе:

Выполните изменения, как показано ниже:

# 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
0 голосов
/ 29 июня 2018

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

...