如何始终设置在Rails的帐户范围的值?
-
16-09-2019 - |
题
我工作的多用户,多帐户应用,其中1个帐户可以具有n个用户。每个用户只能从它的帐户访问信息是非常重要的。我的做法是一个ACCOUNT_ID添加到数据库的每个模型,不是在每个控制器添加一个过滤器,只选择与当前ACCOUNT_ID对象。我将使用授权插件。
时,这种方法是一个好主意?
什么是始终设置是无需编写创建的每个对象的ACCOUNT_ID的最佳方式。
object.account = @current_account
在每CREATE作用?也许一个过滤器?
另外,我不知道要实现对选择选项过滤器的最佳途径。我需要这样的东西一般情况:不管还有什么出现在SQL语句中,总有一个“WHERE ACCOUNT_ID = XY”
感谢您的帮助!
解决方案
这是类似于User.has_many:电子邮件场景。你不希望用户通过URL变化的ID,看其他人的电子邮件,那么你这样做:
@emails = current_user.emails
在你的情况,你也许可以做这样的事情:
class ApplicationController < ActionController::Base
def current_account
@current_account ||= current_user && current_user.account
end
end
# In an imagined ProjectsController
@projects = current_account.projects
@project = current_account.projects.find(params[:id])
其他提示
我知道,我知道,如果你访问你的模型会话变量或实例变量,你不明白MVC模式和“应该回到PHP”。像我们这样的 - - 但尽管如此,如果你有这可能是非常有用的大量控制器和动作的,你不要总想写出@ current_account.object.do_something(不是很干)
。我发现该溶液是很容易的:
步骤1: 您current_account添加到Thread.current,所以例如:
class ApplicationController < ActionController::Base
before_filter :get_current_account
protected
def get_current_account
# somehow get the current account, depends on your approach
Thread.current[:account] = @account
end
end
步骤2: 添加current_account方法,所有模型
#/lib/ar_current_account.rb
ActiveRecord::Base.class_eval do
def self.current_account
Thread.current[:account]
end
end
第3步:瞧,你的模型,你可以做这样的事情:
class MyModel < ActiveRecord::Base
belongs_to :account
# Set the default values
def initialize(params = nil)
super
self.account_id ||= current_account.id
end
end
您也可以用类似的active_record的before_validation回调的工作,然后用验证确保该帐户始终设置做出。
同样的方法可以使用,如果你总是希望在CURRENT_USER添加到每个创建的对象。
你怎么认为呢?
要回答你的第二个问题,看看新的 default_scope
特征在滑轨2.3
我知道你不想理会作用域您帐户中的所有时间。让诚实,它在一个有疼痛感**。
要加一点魔法,并已确定范围本做无缝给予看看下面的宝石
http://gemcutter.org/gems/account_scopper
希望这有助于,
- 格罗斯让 - ZenCocoon