Как обрабатывать периодически изменяющиеся данные базы данных в приложении Rails? - PullRequest
4 голосов
/ 11 января 2011

РЕДАКТИРОВАТЬ: Я полностью переписал этот вопрос для ясности.Я не получил никаких комментариев и ответов раньше.

Я поддерживаю приложение 2.x Rails с большим количеством статистических данных.Некоторые данные реальны, а некоторые оцениваются на будущие годы.Каждый год мне нужно обновлять оценочные данные реальными данными и рассчитывать новые оценки.

Я использовал БОЛЬШИЕ yml-файлы и миграции для загрузки данных в приложение каждый год.Мои миграции полны оценочных расчетов и исправлений данных.


Проблема

Мои миграции полны материалов, не относящихся к схеме, и я даже не могу мечтать о выполнении db: migrate: сброс без ожидания несколько часов(если это даже работает).Я хотел бы видеть мои миграции красивыми и чистыми - только с изменениями, связанными со схемой.Но как мне обновлять данные каждый год, если не использовать миграции?


Требуется помощь

Я хотел бы услышать ваши комментарии и ответы.Я не ищу серебряную пулю - больше как лучшие практики и идеи, как люди справляются с подобной ситуацией.

Ответы [ 4 ]

1 голос
/ 06 февраля 2011

Похоже, вы выполняете большую операцию (загрузку данных с использованием yml-файлов) один раз в год, но меньшие операции - раз в месяц.

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

Я бы использовал структуру обработки заданий, такую ​​как resque и resque scheduler .

Вы можете запланировать выполнение заданий раз в месяц, год, день или постоянно. Работа - это что-то вроде загрузки yml-файлов (или наборов yml-файлов) или очистки данных. Вы можете контролировать параметры для отправки на работу, чтобы вы могли использовать один класс, но по-разному обновлять или очищать ваши данные в зависимости от того, как вы ставите в очередь или планируете работу.

1 голос
/ 03 февраля 2011

На вашем месте я бы занялся созданием пользовательского рейка.У вас будет доступ ко всем вашим моделям и соединениям с активной записью, и раз в год вы будете делать:

rake calculate
1 голос
/ 03 февраля 2011

Прежде всего, я должен сказать, что это очень интересный вопрос. Насколько я знаю, загрузка данных из миграций не очень хорошая идея. Вообще говоря, вы должны использовать db / seed.rb для загрузки данных в вашу базу данных, и я думаю, что было бы неплохо написать небольшой помощник по классу для вставки в вашу директорию lib и затем вызвать его из db / seed.rb. Я представляю, что вы можете организовать ваши файлы следующим образом:

lib/data_loader.rb
lib/years/2009.rb
lib/years/2010.rb

Очевидно, вы должны очистить свои миграции и написать код для lib / data_loader.rb так, как вам удобнее, но я всего лишь пытался предложить общее представление о том, как бы я организовал свой код, если мне придется столкнуться с проблемой вот так.

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

0 голосов
/ 06 февраля 2011

У меня есть ситуация, когда мне нужно загружать данные из файлов CSV, которые меняются нечасто, и ежедневно обновлять данные из Интернета.Я приведу несколько полный пример того, как сделать первое.


Сначала у меня есть файл рейка в lib/tasks/update.rake:

require 'update/from_csv_files.rb'

namespace :update do

  task :csvfiles => :environment do
    Dir.glob('db/static_data/*.csv') do |file|
      Update::FromCsvFiles.load(file)
    end
  end

end

=> :environment означает, что мыбудет иметь доступ к базе данных через обычные модели.

Тогда у меня есть код в файле lib/update/from_csv_files.rb для выполнения фактической работы:

require 'csv'

module Update
  module FromCsvFiles

    def FromCsvFiles.load(file)
      csv = CSV.open(file, 'r')
      csv.each do |row|
        id = row[0]

        s = Statistic.find_by_id(id)
        if (s.nil?)
          s = Statistic.new
          s.id= id
        end

        s.survey_area = row[1]
        s.nr_of_space_men = row[2]
        s.save
      end
    end

  end
end

Тогда я могу просто запустить rake update:csvfilesвсякий раз, когда мои CSV-файлы меняются, чтобы загрузить новые данные.У меня также есть другая задача, которая аналогичным образом настроена на обновление моих ежедневных данных.


В вашем случае вы сможете написать некоторый код для загрузки ваших файлов YML или сделать свои вычисления напрямую.Для обработки ваших небольших исправлений вы можете создать универсальный метод для загрузки YML-файлов и вызывать его с конкретными файлами из задачи rake.Таким образом, вам нужно всего лишь включить файл YML и обновить файл rake новой задачей.Для обработки порядка выполнения вы можете создать задачу rake, которая вызывает другие задачи rake в соответствующем порядке.Сейчас я просто подбрасываю некоторые идеи, вы знаете лучше меня.

...