Подтвердить что ты не робот

Лучшая практика для массового обновления в контроллере

Мне интересно, что является лучшей практикой для разрешения массового редактирования/обновления в контроллере. Я действительно не могу найти статьи или руководства по этому вопросу.

4b9b3361

Ответ 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:

Это очень важно для создания одного оператора 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 тоже есть аналогичный механизм.