我工作的多用户,多帐户应用,其中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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top