Мне интересно, что является лучшей практикой для разрешения массового редактирования/обновления в контроллере. Я действительно не могу найти статьи или руководства по этому вопросу.
Лучшая практика для массового обновления в контроллере
Ответ 1
Я вижу, что вы отметили свой вопрос с помощью REST.
Чтобы сделать это RESTfully, вам нужно подумать о коллекции или самом обновлении в качестве ресурса.
Предположим, вы работаете с объектами Product.
Вы можете PUT to/product_batches/[some identifier], который вызвал бы обновление ProductBatchesController #, но тогда вы застряли, задаваясь вопросом, что входит в [некоторый идентификатор]. Вы можете сделать ProductBatch a особый ресурс, а затем вам не нужен идентификатор.
Лучше может быть POST to/product_bulk_updates, который вызовет ProductBulkUpdatesController # create
class ProductBulkUpdatesController < ApplicationController
def create
# your magic here
# - update_all if you are making the same change to all Products
# - looping through the hashes in params[products] if you are passing in distinct changes to each.
end
end
Вот еще один поток: Манипуляция массовой коллекцией через API REST (RESTful)
Ответ 2
Я не думаю, что существует стандартный способ. Вы можете использовать update_attributes
(пример с PostsController):
def update_bulk
@posts = Post.where(:id => params[:ids])
# wrap in a transaction to avoid partial updates (move this logic to the model!)
if @posts.all? { |post| post.update_attributes(params[:post]) }
redirect_to(posts_url)
else
redirect_to(:back)
end
end
Или используйте update_all
, но обратите внимание, что не будут вызываться ни обратные вызовы, ни проверки:
def update_bulk
Post.where(:id => params[:ids]).update_all(params[:post])
redirect_to(posts_url)
end
Ответ 3
Если вам посчастливилось работать в Rails 3, вы должны обязательно проверить ActiveRecord:: Relation # update_all или ActiveRecord:: Base # update_all в Rails 2:
- Rails 3: http://apidock.com/rails/ActiveRecord/Relation/update_all
- Rails 2: http://apidock.com/rails/ActiveRecord/Base/update_all/class
Это очень важно для создания одного оператора SQL-запроса, чем для полного выполнения SQL-запроса для обновления элементов.
Важное примечание. Это действительно массовое обновление с использованием инструкции обновления SQL. Он не будет создавать экземпляры ActiveRecord, поскольку обновление выполняется исключительно в SQL. Поскольку такие вызовы и проверки ActiveRecord не будут вызываться.
Примеры из приведенного выше URL:
# Update all customers with the given attributes
Customer.update_all :wants_email => true
# Conditions from the current relation also works
Book.where('title LIKE ?', '%Rails%').update_all(:author => 'David')
Примечание. Насколько я могу судить по сообщениям в Интернете, эта функциональность была где-то между ошибкой и ошибкой в Rails 3.0.3, 3.0.7 - 3.0.9.
Я не обнаружил эту функцию до 3.1.0, поэтому я не могу ее подтвердить.
Ответ 4
Я не пробовал это, и это не правда, объемная операция уровня модели, но тем не менее это кажется интересным.
batch_api gem позволяет собирать запросы и отправлять их за один раз. У Facebook тоже есть аналогичный механизм.