вставка новых записей в таблицу базы данных в моем случае - PullRequest
2 голосов
/ 21 ноября 2011

Я занимаюсь разработкой Rails v2.3 приложения, которое является службой для поиска информации о проектах , где информация о проектах хранится в базе данных.

В базе данных существует таблица projects, подобная следующей:

enter image description here

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

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

Например, , если поиск по слову " portal ", оба Портал проката автомобилей и Положение отслеживания портала записей должно бытьнайден приложением Rails. В этой базе данных приложения должны быть все записи каждого отдельного слова из project_name.

Итак, я планирую сгенерировать эти новые записи с помощью , разделивзначение в project_name столбце (из приведенной выше таблицы projects) в отдельные слова , а затем использовать каждое отдельное слово в качестве новая запись project_name при сохранении остальных столбцов записи без изменений.

Например, в приведенной выше таблице, первая запись имеет project_name " Портал проката автомобилей ", что я собираюсь сделать, это разбить эту строку на 3 словаи создайте следующие три новые записи для вставки в таблицу:

enter image description here

Для этого.Я попытался создать задачу rake , которая получает все записи из исходной таблицы projects, и для каждой записи задача rake разбивает строковое значение столбца project_name на слова, затем создайте новые записи со словами и вставьте в таблицу.Моя задача rake выглядит следующим образом:

all_records = ActiveRecord::Base.execute("select * from projects;") 
all_records.each do |record|
     user_id = record[0]
     project_name=record[1]
     department = record[2]
     other = record[3]

     words=project_name.split()

     words.each do |word|
         sql = "insert into project values (#{user_id},#{word},#{department},#{other});"
         ActiveRecord::Base.execute(sql)
     end
end

Задача rake хорошо работает , она создает ожидаемые новые записи и вставляется в таблицу projects, НО проблема в том, что для завершения требуется 36 часов !

Это понятно, поскольку исходная таблица очень очень большая, если разбить строку на слова и создать новую запись, это все равно, что создать таблицу в 3 раза больше (предположим, что каждая строка project_name имеет 3 слова).

Мой вопрос:

  • Могут ли некоторые эксперты по Rails предложить мне более эффективный способ достижения новой возможности вставки записи, которую я описал выше?

  • Или любой новый способ включить поиск по одному слову в моем случае?(Это не тот способ, который я разработал для хранения каждого отдельного слова в базе данных.)

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Для более быстрого импорта вы хотите использовать activerecord-import , это ускорит ваше выполнение на пару порядков.

columns = [:title, :project_name, :department, :other]
values = all_records.inject([]) do |values_arr, record|

    user_id, project_name, department, other = record

    project_name.split.each do |name|
        values_arr << [user_id, name, department, other]
    end
    values_arr
end

class TempModel < ActiveRecord::Base; set_table_name "projects"; end
TempModel.import columns, values, :validate=>false
0 голосов
/ 21 ноября 2011

Если вы делаете это только для целей поиска, почему бы вам не использовать Sunspot ? Поддерживает полнотекстовый поиск.

Разделение названия проекта звучит как очень плохая идея для меня.

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

...