Ruby конвертирует массив активных записей или объектов в массив хэшей - PullRequest
1 голос
/ 02 апреля 2020

У меня есть объект Person, представляющий собой модель ActiveRecord с некоторыми полями, такими как: имя, возраст: .et c.

. Лицо имеет отношение 1: 1 к чему-либо, называемому Учетной записью, где каждый человек имеет account.

У меня есть код, который выполняет:

   Account.create!(person: current_person)

, где current_person - это заданный существующий объект активной записи Person.

Примечание. В таблице Account имеется поле для person_id, и у обоих в модели есть has_one для друг друга.

Теперь я считаю, что мы можем сделать что-то подобное ниже для массового создания:

 Account.create!([{person: person3},{person:: person2} ....])

У меня есть массив persons, но я не уверен в наилучшем способе преобразования в массив хэшей, имеющих все одинаковые ключи.

По сути, обратное значение Convert массив хэшей к массиву - это то, что я хочу сделать.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Почему бы просто не l oop над вашим массивом объектов?

[person1, person2].each{|person| Account.create!(person: person)}

Но если по какой-либо причине какой-либо из элементов, которые вы * l oop потерпели неудачу, Account.create!, вы можете остаться в плохое состояние, поэтому вы можете захотеть обернуть это в транзакцию активной записи .

ActiveRecord::Base.transaction do
  [person1, person2].each{|person| Account.create!(person: person)}
end
2 голосов
/ 02 апреля 2020

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

  Account.create!(persons.map { |person| Hash[:person_id, person.id] })

Если вам нужно создать все записи в одной и той же операции с базой данных и использовать рельсы 6+, вы можете использовать метод insert_all .

  Account.insert_all(persons.map { |person| Hash[:person_id, person.id] })

Для предыдущих версий рельсов вы должны рассмотреть возможность использования activerecord-import gem.

  # Combination(1).to_a converts [1, 2, 3] to [[1], [2], [3]]
  Account.import [:person_id], persons.pluck(:id).combination(1).to_a
...