Rails / Cancan - 通过关联加载资源

Rails / Cancan - load resources through association

我有这些型号:

Company 
  has_many :users
  has_many :accounts

User
  belongs_to :company

Account
  belongs_to :company

用户应该可以通过他们的公司访问某些资源,我想使用 Cancan 隐式加载这些资源:

class AccountsController < ApplicationController
  load_resource # Cancan doesn't know how to load through the user's company

我显然可以明确地做到这一点:

class AccountsController
  def index
    @accounts = current_user.company.accounts
  end

但这似乎是不必要的代码,我怀疑已经有一个模式可以解决这个问题。

我看到 Cancan 可以为当前用户定义一个 through:

class AccountsController
  load_resource through: :current_user

但这会调用 current_user.accounts - 这是无效的,因为帐户属于公司,而不属于用户。我可以推迟从用户到公司的 accounts 呼叫,但这似乎是一个 hack。

我也试过传入一个字符串:

class AccountsController
  load_resource through: 'current_user.company'

这给了我 '@current_user.company' is not allowed as an instance variable name

我用谷歌搜索了一下,但没找到。有帮助吗?

尝试这样的事情:

class AccountsController
  load_resource :company, through: :current_user, singleton: true
  load_resource through: :company
end

在你的例子中,我相信你已经在 @accounts = current_user.company.accounts 中有了这个。使用 cancan 的 load_resource 加载公司,然后该帐户应该会产生一组类似的查询。