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

10 ruby activerecord ruby-on-rails

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

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

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

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

Pra*_*ras 10

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

class Model < ActiveRecord::Base
  default_scope :conditions => ['client_id = ?', client_id]
end
Run Code Online (Sandbox Code Playgroud)

您必须确保在init进程中的某个位置设置了client_id.

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