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
加载公司,然后该帐户应该会产生一组类似的查询。
我有这些型号:
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
加载公司,然后该帐户应该会产生一组类似的查询。