Каков наилучший метод создания "огороженных садов" для нескольких клиентов внутри вашей базы данных?

Я создаю сайт стиля 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

Как добавить новую базу данных для каждого клиента? Таким образом, разделение клиента более конкретное, а ошибки, когда клиенты могут использовать другие данные клиентов, менее вероятны.