Лучшая практика для ежедневного импорта частичного дампа базы данных в приложение rails?

iTunes Enterprise Partner Feed: поток данных с полным набором метаданных из iTunes и App Store «и» доступен в двух разных форматах - либо как файлы, необходимые для создания реляционной базы данных, либо как отдельные плоские файлы, которые зависят от страны и носителя ».

Мне нужно использовать данные из этого фида (который по сути экспортируется в плоские файлы) и разрешить связывание моих собственных объектов модели (User, Activity и т. Д.) С данными, предоставленными фидом (App, Developer и т. Д.). предоставляется как еженедельный полный экспорт и ежедневный инкрементный экспорт.

У меня есть две идеи, как это реализовать:

  1. Создайте все модели в моем приложении rails и напишите свой собственный импортер, который будет ежедневно вставлять / обновлять записи непосредственно в базу данных моего приложения через cron, используя созданные мной модели (приложение, разработчик и т. Д.)
  2. Держите эту базу данных отдельно и откройте REST API, который будет использовать мое собственное приложение.

Мой наивный подход к №1, чтобы сохранить все в приложении Rails, основан на необходимости иметь возможность наблюдать за изменениями данных, которые я получаю из EPF. Например, если описание приложения обновляется, я хочу иметь возможность создать объект Activity через наблюдателя для отслеживания этого обновления.

С одной стороны, №2 кажется лучшим подходом, потому что он создает автономный API для данных, которые можно использовать из нескольких разных приложений, которые я создаю. С другой стороны, я просто не уверен, как бы выполнить уведомления об изменении данных без использования наблюдателей непосредственно на моих собственных моделях. Или как бы я мог потреблять данные объектно-ориентированным способом, который все еще можно было бы использовать с моими собственными моделями. Похоже, много дублированной работы приходится запрашивать у API, скажем, данные приложения, создавать для них соответствующий объект Active Record, а затем сохранять его, чтобы его можно было связать с одной из моих собственных моделей.

Есть ли стандартный способ сделать это, которого мне совершенно не хватает? Есть указатели?

РЕДАКТИРОВАТЬ: движки Rails звучат интересно, но это будет означать, что каждое приложение по-прежнему будет потреблять и вставлять данные отдельно. Это не звучит так СУХОЕ. Все больше и больше похоже на REST API. Я просто не знаю, как преодолеть разрыв от API к модели Active Record.


person markquezada    schedule 18.11.2010    source источник


Ответы (1)


Rails Engines может подойти для этого. Вы можете создать гем Rails Engine и добавить все свои модели и задачи с граблями для потребления данных. Затем вы можете включить этот драгоценный камень в любое приложение, которое его использует, а также создать приложение API, которое включает этот драгоценный камень. У вас должна быть возможность создавать наблюдателей в других ваших приложениях, которые взаимодействуют с драгоценным камнем.

У меня довольно много приложений, которые взаимодействуют друг с другом, и этот подход мне подходит. У меня есть одно центральное приложение, которое включает все механизмы, потребляющие данные, и я запускаю все свои cronjobs из этого приложения. Я использую плагин use_db, который позволяет моему приложению взаимодействовать с разными базами данных. У каждого движка есть use_db в качестве зависимости, и я сохраняю конфигурацию базы данных внутри гема. Один пример:

  1. Самоцвет двигателя = transaction_core
  2. Этот драгоценный камень потребляет данные транзакции из источника и вставляет их в мою базу данных транзакций.
  3. Драгоценный камень включен в мое центральное приложение, и я извлекаю данные транзакции с помощью задачи rake в cron.
  4. Я включаю этот драгоценный камень в несколько других приложений, которым необходимо использовать данные транзакции. Поскольку движок автоматически добавляет модели и конфигурацию базы данных в приложение, для использования моделей в приложении не требуется дополнительной работы.

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

У Modest Rubyist есть хороший учебник из 4 частей по плагинам Rails 3, который включает движки:
http://www.themodestrubyist.com/2010/03/05/rails-3-plugins---part-2---writing-an-engine/

person johnmcaliley    schedule 19.11.2010
comment
Я не совсем уверен, что это то, что я ищу, но это действительно первое, что я слышал о рельсовых двигателях. Я постараюсь взглянуть на них повнимательнее. Спасибо. - person markquezada; 19.11.2010
comment
Движки - это, наверное, моя любимая функция Rails 3. По сути, это просто приложения с мини-рельсами, которые вы можете включить в другие приложения с помощью драгоценного камня. Этот подход будет похож на №1, но вы можете использовать его в нескольких приложениях (например, №2), если вы используете плагин, который может обрабатывать разные соединения с базой данных для каждой модели. - person johnmcaliley; 20.11.2010
comment
вы можете использовать существующий гем для импорта github.com/igorkasyanchuk/rails_db - person Igor Kasyanchuk; 02.12.2015