AND user_id = current_user
语句添加到发送到数据库的所有SQL查询中(我将user_id列添加到所有表中)。我基本上想要确保用户完成的所有操作仅在他的数据上执行。
此致 Mateusz
答案 0 :(得分:0)
没有办法在应用程序级别强制执行它,强制执行它的唯一方法是禁止团队使用Class.find / where / etc方法并允许仅在集合上调用它们。因此,不应该使用Task.find而应使用current_user.tasks.find等。
答案 1 :(得分:0)
您可以使用默认范围添加AbstractModel,然后从中继承所有其他模型:
class AbstractModel < ActiveRecord::Base
self.abstract_class = true
default_scope where(:user_id => Thread.current[:current_user])
end
class SomeModel < AbstractModel
...
end
我使用了Thread.current[:current_user]
,因为在模型中无法访问current_user。您应该在ApplicationController等的一些before_filter方法中将current_user分配给Thread.current。
答案 2 :(得分:0)
听起来你所追求的是在你的应用程序中实现多租户的策略。
您可能需要查看multitenant gem,这可以帮助您将查询与属于当前租户的数据隔离开来。
或者,您可以使用PostgreSQL架构在数据库级别强制执行此操作。 Gay Naor在实施这一策略方面有excellent talk。
如果你搜索“多租户rails应用”,你会发现其他几个关于这个问题的讨论。