2014-11-28 7 views
-1

У меня есть несколько записей в моей базе данных, и новые записи поступают через XML в связках. Мне нужно обновить часть данных или создать новую, если соответствующая запись не найдена. Поэтому я хочу найти лучший способ обновить их с точки зрения производительности и загрузки базы данных.Что лучше [читать, проверять, писать] каждый или просто [писать] все?

Первый способ: читайте каждую запись по-одному из XML, сравнивайте их с существующей и обновляйте только поля, которые отличаются.

Второй способ: просто обновите все поля для каждой записи.

Если есть другой способ, не стесняйтесь предложить :)

+0

Если у вас есть уникальная поле, которое проходит через данные xml, вы можете попытаться найти запись, если не нашли, создать новую, а в записи обновить все остальные атрибуты, которые входят. – Nermin

ответ

0

Даже если вы запустили прямой update, рельсы сделают read/check/update из валидаций и других вещей. Поскольку вставки должны выполняться один раз, если вы действительно хотите улучшить нагрузку на БД, вы можете как минимум загрузить все записи один раз.

records = Model.where(id: list_of_ids) 
xml_list.each do |xml_model| 
    record = records.select {|r| r.id == xml_model.id} 
    #do_stuff unless record.nil? 
end 

Где list_of_ids - массив идентификаторов. Таким образом, вы перемещаете повторные поиски в памяти вместо DB. Если идентификаторы слишком много, посмотрите на find_each

records = Model.find_each 

Но вы должны быть в состоянии найти на вашем xml_list по идентификатору, и я не уверен в этом ...

+0

Так что мне не нужно проверять вручную? Пока что я разбираю XML, затем поиск соответствующей записи с помощью 'find_by', затем обновляю ее и относительные данные из других таблиц. – Dezl

+0

Не знаете, каков размер ваших «пачек», но как разобрать все ваши объекты, превратив их в объекты 'model', а затем загрузить соответствующие записи с моим кодом? – iMacTia

+0

Ну, я попытаюсь загрузить все с помощью одного запроса с 'joins' и' where'. – Dezl

Смежные вопросы