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