我正在建立一个SaaS风格的网站,我将拥有多个客户端,他们都在同一个网站上管理他们的工作流程和数据 - 因此也是同一个数据库。
我甚至不确定这个概念是否有一个词,但有没有任何已建立的自动隔离数据的方法,以便任何ActiveRecord对数据库的调用都被用户的正确client_id过滤/限制已登录?
直接的方法当然是添加一个“where client_id = ?
”并将用户的客户端ID放入每个ActiveRecord请求的末尾。
对于模型有没有任何过滤器的想法,所以任何find方法(包括动态方法)都会自动地对它们client_id
进行处理?所以我可以做Model.find_by_what_I_want(foo)
,它会自动知道将其限制为仅由正确的客户端ID拥有的记录,即使我没有明确指定它?
答案 0 :(得分:10)
如果您使用的是Rails 2.3+,则可以使用默认范围:
class Model < ActiveRecord::Base
default_scope :conditions => ['client_id = ?', client_id]
end
您必须确保在init进程中的某处设置了client_id。
这将确保该模型中的所有数据库查询都使用client_id条件。
答案 1 :(得分:0)
如何为每位客户添加新数据库?这样,客户分离就更加具体,而客户可以获得其他客户数据的错误则更不可能。