我有一个用来管理用户的dashboard_controller。下面是控制器:
class DashboardController < ApplicationController
before_action :authenticate_user!
def index
if current_user.admin?
@users = current_user.get_organization_users
else
flash[:notice] = "Unauthorized Page View"
redirect_to(tasks_url)
end
end注意,我使用的是@users = current_user.get_organization_users。下面是我的用户模型中的get_organization_users方法...
def get_organization_users
self.organization.users
end我该如何用作用域替换它呢?我试过..。
scope :organization_users, -> { self.organization.users }...but没有工作。感谢您的帮助。
发布于 2016-08-17 03:10:07
scope用于将class method添加到模型中。但是您正在尝试调用instance上的方法。因此,在这种情况下,instance method是有意义的。
但是,如果您想创建一个作用域,请将user_id作为参数传递给该作用域。
scope :organization_users(user_id), -> { find(user_id).organization.users }发布于 2016-08-17 03:08:53
在内部,Active record converts scopes into class methods。
这意味着您不能将实例方法get_organization_users替换为作用域,并期望在类的实例current_user上调用它。
您可以做的是创建一个作用域并将一个参数(很可能是用户id)传递给它,然后直接在user类上调用该作用域。
如果你愿意,我可以举一个例子,但我认为这种方法比期望的方法要长得多。
发布于 2016-08-17 03:03:07
我对你的问题不太清楚。您希望获取属于与当前用户关联的组织的所有用户,对吗?在这种情况下,您应该直接调用current_user.organization.users。
Scope用于过滤当前模型中的记录,而不是用于获取关系中的对象。你可以在官方文档中阅读到:http://guides.rubyonrails.org/active_record_querying.html#scopes。
https://stackoverflow.com/questions/38982364
复制相似问题