什么是为数据库内的多个客户创建“围墙花园”的最佳方法?

时间:2009-04-06 18:44:26

标签: ruby-on-rails ruby activerecord

我正在建立一个SaaS风格的网站,我将拥有多个客户端,他们都在同一个网站上管理他们的工作流程和数据 - 因此也是同一个数据库。

我甚至不确定这个概念是否有一个词,但有没有任何已建立的自动隔离数据的方法,以便任何ActiveRecord对数据库的调用都被用户的正确client_id过滤/限制已登录?

直接的方法当然是添加一个“where client_id = ?”并将用户的客户端ID放入每个ActiveRecord请求的末尾。

对于模型有没有任何过滤器的想法,所以任何find方法(包括动态方法)都会自动地对它们client_id进行处理?所以我可以做Model.find_by_what_I_want(foo),它会自动知道将其限制为仅由正确的客户端ID拥有的记录,即使我没有明确指定它?

2 个答案:

答案 0 :(得分:10)

如果您使用的是Rails 2.3+,则可以使用默认范围:

class Model < ActiveRecord::Base
  default_scope :conditions => ['client_id = ?', client_id]
end

您必须确保在init进程中的某处设置了client_id。

这将确保该模型中的所有数据库查询都使用client_id条件。

答案 1 :(得分:0)

如何为每位客户添加新数据库?这样,客户分离就更加具体,而客户可以获得其他客户数据的错误则更不可能。