Каков наилучший метод создания "огороженных садов" для нескольких клиентов внутри вашей базы данных?
Я создаю сайт стиля SaaS, в котором у меня будет несколько клиентов, которые будут управлять своими рабочими процессами и данными на одном и том же сайте, и, таким образом, одну и ту же базу данных.
Я даже не уверен, есть ли слово для этой концепции, но существует ли какой-либо установленный способ автоматического разделения данных, чтобы любые вызовы ActiveRecord в базу данных были отфильтрованы/ограничены правильной клиентской идентификацией пользователя, которая вошел в систему?
Простым способом было бы, конечно, просто добавить "where client_id = ?
" и поместить в идентификатор клиента пользователя... в конец каждого запроса ActiveRecord.
Есть ли какие-либо идеи фильтра для моделей, так что любой метод поиска (включая динамические) будет автоматически привязываться к client_id
к ним автоматически?. Поэтому я мог просто сделать Model.find_by_what_I_want(foo)
, и он автоматически знал бы, что это ограничивает только записи, принадлежащие правильному идентификатору клиента, хотя я не указал его явно?
Ответы
Ответ 1
Если вы используете Rails 2.3+, у вас есть роскошь по умолчанию:
class Model < ActiveRecord::Base
default_scope :conditions => ['client_id = ?', client_id]
end
Вам нужно убедиться, что client_id установлен где-то в процессе инициализации.
Это обеспечит, чтобы все запросы db в этой модели использовали условие client_id.
Ответ 2
Как добавить новую базу данных для каждого клиента? Таким образом, разделение клиента более конкретное, а ошибки, когда клиенты могут использовать другие данные клиентов, менее вероятны.