Существует несколько вариантов обработки приложения с несколькими арендаторами.
Во-первых, вы можете добавить область к своим таблицам (как предложила Чад Берч - с помощью company_id). Для большинства случаев использования это нормально. Если вы обрабатываете конфиденциальные данные (например, учетную информацию), вы должны быть очень осторожны в своем тестировании, чтобы обеспечить конфиденциальность данных.
Вы можете запустить свою систему, используя несколько баз данных. У вас может быть одно приложение, которое использует базу данных для каждого клиента, или у вас может быть отдельное приложение для каждого клиента. Запуск базы данных для каждого клиента немного сокращается против зерна в рельсах, но это выполнимо. В зависимости от количества ваших клиентов и ожиданий загрузки я бы предпочел взглянуть на запуск отдельных приложений. При некоторой работе по настройке развертывания (capistrano, chef, puppet и т. Д.) Вы можете сделать это очень упрощенным процессом. Каждый клиент работает в совершенно уникальной среде, и если у конкретного клиента есть большие нагрузки, вы можете развернуть их на свой собственный сервер.
Если вы используете PostgreSQL, вы можете сделать что-то подобное с помощью схем. PostgresQL schemas обеспечивают очень удобный способ изоляции ваших данных от разных клиентов. База данных содержит одну или несколько именованных схем, которые, в свою очередь, содержат таблицы. Вам нужно добавить некоторые смайлики в свои миграции и развертывания, но он работает очень хорошо.
Внутри приложения Rails вы присоединяете фильтры к запросу, который включает или выключает схему текущего пользователя.
Что-то вроде:
before_filter :set_app
def set_app
current_app = App.find_by_subdomain(...)
schema = current_app.schema
set_schema_path(schema)
end
def set_schema_path(schema)
connection = ActiveRecord::Base.connection
connection.execute("SET search_path TO #{schema}, #{connection.schema_search_path}")
end
def reset_schema_path
connection = ActiveRecord::Base.connection
connection.execute("SET search_path TO #{connection.schema_search_path}")
end
Почему использование нескольких баз данных - плохая идея? –
Я имею в виду, это довольно распространенная стратегия обеспечения целостности и безопасности данных. –
@ Chhad: Говорить кому-то, чтобы воспитывать себя, не будучи совершенно определенным, натолкнулось на то, что он довольно некрасивый. По крайней мере, ссылка поможет. Сказав это, ваш последний абзац кажется разумным, учитывая отсутствие подробностей в вопросе, но в целом это довольно бесполезный ответ. – aaaidan