如何使用around_filter来扩展Rails中的所有查询?

时间:2012-01-13 21:14:37

标签: ruby-on-rails activerecord

我的问题
我们正在为小型企业开发本地托管的Web应用程序。我们还有一个演示网站,可让潜在客户四处寻找评估产品。现在,所有使用演示站点的客户都可以访问相同的数据,这可能不太理想,因为他们可能会在彼此后面进行修改,这会让应用程序感到“不稳定”,如果他们注意到的话。我想为每个客户提供他们自己的数据子集来改善他们的体验。向我的所有模型添加user_id列很简单,但现在我需要确保所有查询都使用这个新关联。

解决问题的艰难方法
我可以手动完成并将@people = Person.all之类的通话更改为@people = current_user.people,但是蹩脚!主分支的开发工作仍在继续,当我合并到演示分支时,我不希望看到每个查询。

我想做的事情
我想在我的application_controller中创建一个around_filter,它将获取我的查询并添加这个额外的范围层,如下所示:

around_filter :scope_on_current_user

def scope_on_current_user(&block)
  MagicalClass.scope_on_user(current_user, &bock)
end

这是我从octopus得到的一个想法,它是一个数据库分片宝石。我查看了他们的源代码,看起来很毛茸茸。他们几乎肘击深入ActiveRecord,劫持数据库连接等等。我希望这对我想要的东西来说太过分了。关于MagicalClass如何运作的任何建议? :)

Rails 3.1.0
ActiveRecord 3.1.0

1 个答案:

答案 0 :(得分:0)

有一些补丁允许默认范围采用过程see here for details,现在它可以在没有任何补丁/宝石的情况下工作。

Thread.current 相结合可能足以让你前进。

那说......对于单独的DB采取多租户方法可能更有意义吗?