首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换此方法的合适范围是什么?

替换此方法的合适范围是什么?
EN

Stack Overflow用户
提问于 2016-08-17 02:47:55
回答 3查看 34关注 0票数 1

我有一个用来管理用户的dashboard_controller。下面是控制器:

代码语言:javascript
运行
复制
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方法...

代码语言:javascript
运行
复制
def get_organization_users
  self.organization.users
end

我该如何用作用域替换它呢?我试过..。

代码语言:javascript
运行
复制
scope :organization_users, -> { self.organization.users }

...but没有工作。感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-17 03:10:07

scope用于将class method添加到模型中。但是您正在尝试调用instance上的方法。因此,在这种情况下,instance method是有意义的。

但是,如果您想创建一个作用域,请将user_id作为参数传递给该作用域。

代码语言:javascript
运行
复制
scope :organization_users(user_id), -> { find(user_id).organization.users }
票数 1
EN

Stack Overflow用户

发布于 2016-08-17 03:08:53

在内部,Active record converts scopes into class methods

这意味着您不能将实例方法get_organization_users替换为作用域,并期望在类的实例current_user上调用它。

您可以做的是创建一个作用域并将一个参数(很可能是用户id)传递给它,然后直接在user类上调用该作用域。

如果你愿意,我可以举一个例子,但我认为这种方法比期望的方法要长得多。

票数 1
EN

Stack Overflow用户

发布于 2016-08-17 03:03:07

我对你的问题不太清楚。您希望获取属于与当前用户关联的组织的所有用户,对吗?在这种情况下,您应该直接调用current_user.organization.users

Scope用于过滤当前模型中的记录,而不是用于获取关系中的对象。你可以在官方文档中阅读到:http://guides.rubyonrails.org/active_record_querying.html#scopes

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38982364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档