Rails - общие таблицы базы данных между двумя приложениями

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

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

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

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

EDIT: Чтобы выяснить, почему я не хочу запускать оба приложения из одного и того же БД: оба приложения имеют модели с тем же именем (но разные атрибуты моделей и т.д.), поэтому я бы предпочёл не запускать оба из того же БД....

Ответы

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Я думаю, что вам нужна модель share, а не только таблица базы данных, в таблице rails лежит модель.

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