У меня есть EventsController создать действие, которое выглядит следующим образом:ActiveRecord сделки, сохранение записей
class EventsController < ApplicationController
def create
@event = Event.new(params[:event].slice(*Event.accessible_attributes))
if @event.save
DraftBuilder.new(event: @event).build(params[:event][:file].path)
redirect_to @event
else
render :new
end
end
end
Params [: события] [: файл] это файл, который пользователь может отправить через Event # новые действия через file_field_tag.
Метод DraftBuilder # build, между прочим, анализирует данный файл и создает около 1000 записей в базе данных (сохраняет данные в базу данных по нескольким таблицам).
Проблема У меня есть то, что DraftBuilder # build очень медленный. Это медленно, потому что я сохраняю записи в цикле, а Active Record создает новую транзакцию для каждого сохранения.
упрощенный DraftBuilder # сборка может выглядеть следующим образом:
class DraftBuilder
def build(file)
@data = parse(file) #@data is an array of hashes with 1000+ records
@data.each do |pick_arguments|
Pick.create(pick_arguments)
end
end
end
Я нашел одно решение этой проблемы. Заверните контроллер создать действие, чтобы ActiveRecord :: Base.transaction:
class EventsController < ApplicationController
around_filter :transactions_filter, only: [:create]
def transactions_filter
ActiveRecord::Base.transaction do
yield
end
end
end
Хотя это решение работает, создает только одну транзакцию, и ускоряет весь процесс около 60 раз. Это хороший способ решить эту проблему? Разумеется, транзакции для этого не были разработаны? Каковы другие возможности для создания записей из файлов с более чем тысячей записей?
Я думаю, что я видел некоторые Railscasts о delayed_jobs и sidekiq, мне нужно проверить Это. И мне нужно добавить некоторое «уведомление об обработке» в events/show.erb.html, потому что он сразу же запускает ** redirect_to @ event **. Правильно? – Kocur4d