0

我有一个 API。在那个 api 中是一个基本控制器,所有其他控制器都从它继承。basecontroller 处理身份验证以及 API 是否打开等。

有用户,用户可以属于一个组。用户表有一个 group_id 列。

我正在尝试引入一项新功能,即在设置页面上选择管理员控制从哪些组显示哪些用户。如果选择了某个选项,则 api 应仅显示该组中的用户。

我可以进入每个控制器(对于几个不同的任务中的每一个都有一个控制器 - 获取所有用户信息,只有 active_users ids,单个用户信息等)并将额外的语句添加到每个

if !settings.api_group.nil?
  #add the additional where("group_id = ?, settings.group_id)

但这似乎是在重复自己(在 8 个不同的地方做)

有没有办法向 basecontroller 添加一些内容:

如果此设置选项不为零,则仅返回该组中的用户信息

?

谢谢

4

2 回答 2

1

您可以向 BaseController 添加一个方法,并在每个应具有此限制的操作中调用它。像这样的东西:

在 base_controller.rb 中:

protected

def filtered_users
  if settings.api_group
    User.where(:group_id => settings.group_id)
  else
    User.scoped
  end
end

并在从它继承的控制器中:

def index
  @users = filtered_users
end

这样,您只需在一个地方定义过滤。如果以后需要更改,您只需在一处更改即可。因为实际上返回一个关系,您可以通过添加附加子句等filtered_users来继续更改查询,如下所示:.where

@users = filtered_users.joins(:posts).where('posts.created_at > ?', 1.week.ago)

于 2013-01-16T20:26:28.623 回答
0

仅供参考,我的回答正是我认为它可能必须在最初的帖子中。我希望有一个更干燥的解决方案,但我最终做了这样的事情:

在用户模型中

def find_in_api_group
  # NOTE settings.api_group is a string => "1,2,4"
  if settings.api_group.nil? || settings.api_group.blank?
    where("") # THERE HAS TO BE BETTER WAY OF SAYING THIS WITHOUT INTERRUPTING THE CHAIN
  else
    where("group_id IN (?)", settings.api_group)
  end
end

在各种控制器中

user = User.find_in_api_group 
#then chain various error tests and additional activeRecord statement
于 2013-01-17T17:37:07.973 回答