Rails Active Record - Сохранить несколько объектов одновременно - PullRequest
0 голосов
/ 04 июля 2018

Я посмотрел на этот вопрос и не нашел ответа, который работал бы для меня.

У меня есть, например, модель проекта, в которой есть задачи. Я хотел бы создать из массива атрибутов много задач для какого-то проекта. Итак, в моей модели проекта у меня был бы такой метод (упрощенный пример):

def create_tasks(tasks)
   tasks.map{|t| Task.create(project: self, name: t.name)}
end

Проблема в том, что для каждой задачи это будет ударять по моей базе данных и для большого количества записей, что нежелательно. Как я мог сделать это, чтобы ActiveRecord сделал только один вызов в мою базу данных? Заранее спасибо!

1 Ответ

0 голосов
/ 04 июля 2018

Каждый вызов для вставки в базу данных будет осуществляться отдельно (в разных транзакциях). Но вы можете уменьшить общую задержку, объединяя все творения в одну транзакцию.

Task.transaction do
    tasks.each{ |task| Task.create(...) }
end

В этом случае все ваши творения будут заключены в одну атомарную транзакцию БД.

Взгляните на transaction документацию.

Также вы можете попробовать accepts_nested_attributes_for.

Вложенные атрибуты позволяют сохранять атрибуты в связанных записях через родительский элемент.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...