Как создать / обновить несколько записей с меньшим количеством транзакций базы данных (избегая цикла).? - PullRequest
0 голосов
/ 04 июля 2019

Для создания я использовал

contact_ids = params[:ticket_note][:contact_ids].reject(&:blank?)
contact_ids.each do |contact_id|
  @ticket_note_recipient = TicketNoteRecipient.new
  @ticket_note_recipient.ticket_note_id = @ticket_note.id
  @ticket_note_recipient.account_contact_id = contact_id
  @ticket_note_recipient.save
end

Для обновления я использовал

contact_ids = params[:ticket_note][:contact_ids].reject(&:blank?)
  @d_ticket_note_recipients = TicketNoteRecipient.where(:ticket_note_id =>@ticket_note)
  .where.not(:account_contact_id => contact_ids).delete_all

  contact_ids.each do |contact_id|
    @ticket_note_recipient = TicketNoteRecipient.where(:ticket_note_id =>@ticket_note)
    .where.not(:account_contact_id => contact_id).first
    if @ticket_note_recipient.blank?
      @ticket_note_recipient = TicketNoteRecipient.new
      @ticket_note_recipient.ticket_note_id = @ticket_note.id
      @ticket_note_recipient.account_contact_id = contact_id
      @ticket_note_recipient.save
    end
  end

Как мы можем сделать это с меньшим количеством транзакций базы данных?

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Невозможно вставить / изменить несколько записей с направляющими из коробки. Однако вы можете использовать activerecord-import gem для этого.

Rails по умолчанию принимает массивы при создании новых объектов, например:

VoteRecord.create(
  [
    { :prospect_id => prospect.id, :state => "OH", :election_type => "GE", :election => "2011-11-08", :party => row[82], :participate => participated(row[82]) },
    { :prospect_id => prospect.id, :state => "OH", :election_type => "PR", :election => "2011-09-13", :party => row[81], :participate => participated(row[81]) }
    ...
  ]
)

Однако при этом все равно будет создано n запросов, по одному на каждую вставку, поэтому единственный способ достичь этого (без самостоятельного написания SQL-запроса) - это использование activerecord-import

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

Если вы действительно говорите о меньшем количестве транзакций , как указано в вашем вопросе, то это путь, заключив его в Transaction

ApplicationRecord.transaction do
  contact_ids.each do |contact_id|
     # ...
     @ticket_note_recipient.save
   end
 end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...