Rails - таблицы общих баз данных между двумя приложениями - PullRequest
16 голосов
/ 12 января 2010

Мы скоро выпустим сопутствующее приложение Rails для нашего существующего приложения Rails. Мы будем запускать сопутствующее приложение вместе с нашим существующим приложением на тех же серверах.

Мой вопрос касается баз данных. Мой хостинг-провайдер обычно настраивает 2-ю отдельную базу данных для нового приложения - secondappname_production. Однако между приложениями существует ряд общих таблиц. Эти общие таблицы также поддерживаются рядом заданий cron. Я хотел бы избежать дублирования этих таблиц (и, следовательно, заданий cron), если это вообще возможно.

Есть ли способ, которым я могу поместить эти общие таблицы, возможно, в общую базу данных, которую могут использовать оба приложения Rails? Любые предложения о том, как настроить это или указатели документации?

Большое спасибо!

РЕДАКТИРОВАТЬ: Чтобы выяснить, почему я не хочу запускать оба приложения из одной и той же БД: оба приложения имеют модели с одинаковым именем (но разные атрибуты моделей и т. Д.), Поэтому я бы предпочел не запускать оба из одной БД ....

Ответы [ 2 ]

24 голосов
/ 12 января 2010

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

Чтобы указать другую базу данных для конкретной модели, попробуйте что-то вроде этого:

class SharedModelBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(ActiveRecord::Base.configurations["shared_db_connection_#{RAILS_ENV}"])
end

Теперь используйте это как базовый класс для ваших общих моделей, и вам будет хорошо.

Часть вашего вопроса - это лучшие практики, поэтому пара других вариантов.

Один из вариантов - даже не пытаться получить доступ к БД напрямую, а вместо этого создать интеграцию между приложениями, используя ActiveResource. Пусть исходное приложение предоставит интерфейс RESTful к этим таблицам, и использует его в новом приложении, и вообще не разделяет базу данных. Мне нравится эта опция, но она может быть неуместной для вашей ситуации.

Другим вариантом является рефакторинг этих общих таблиц в их собственную базу данных, и оба приложения rails получают доступ к этой базе данных. Вы даже можете в конечном итоге написать сервисы (например, restful interface) для этих общих данных, которые будут использоваться обоими приложениями, и тогда вы будете прекрасно разделены.

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

0 голосов
/ 07 апреля 2015

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

create main rails app -->rake g model User name:string->rake db:migrate
create shared rails app 
-->rake sync:copy 
-->(DO NOT generate same model in shared app, also do not db:migrate)
-->config/generater shared
controller and router.rb file(dependend your requirement)

sync.rake (appshared / Lib / задачи /)

namespace :sync do

      desc 'Copy common models and tests from Master'
      task :copy do
        source_path = '/Users/ok/github/appDataTester/appmain'
        dest_path = '/Users/ok/github/appDataTester/appshared'

        # Copy all models & tests
        %x{cp #{source_path}/app/models/*.rb #{dest_path}/app/models/}
        %x{cp #{source_path}/test/models/*_test.rb #{dest_path}/test/models/}

        # Fixtures
        %x{cp #{source_path}/test/fixtures/*.yml #{dest_path}/test/fixtures/}

        # Database YML
        %x{cp #{source_path}/config/database.yml #{dest_path}/config/database.yml}
      end
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...