Ruby on rails 带有WHERE子句的Rails索引操作

Ruby on rails 带有WHERE子句的Rails索引操作,ruby-on-rails,Ruby On Rails,我正在尝试学习Rails,所以我知道我可能会遗漏一些简单的概念 我有一份员工名单,每个人都属于一个给定的项目。登录到系统的用户应仅查看/管理属于其项目的人员(用户也附加到给定项目)。这意味着我在用户和员工模型中都有项目id 我希望当前用户只查看他/她自己项目中的记录。 我在MichaelHartl的书中实现了身份验证系统,因此我已经定义了一个当前的用户方法并开始工作 以下是我的索引操作: def index @staffs = Staff.where("current_user.project_

我正在尝试学习Rails,所以我知道我可能会遗漏一些简单的概念

我有一份员工名单,每个人都属于一个给定的项目。登录到系统的用户应仅查看/管理属于其项目的人员(用户也附加到给定项目)。这意味着我在用户和员工模型中都有项目id

我希望当前用户只查看他/她自己项目中的记录。 我在MichaelHartl的书中实现了身份验证系统,因此我已经定义了一个当前的用户方法并开始工作

以下是我的索引操作:

def index
@staffs = Staff.where("current_user.project_id = ?", 'staff.project_id') 
end
但是,我得到一个错误:

no such column: current_user.project_id
我没有主意了。我如何实现这一点

Staff.where("current_user.project_id = ?", 'staff.project_id')
此处
当前用户。项目id
不是员工模型的列。在活动记录
中,其中
期望第一个参数是给定模型的列名。所以这里的模型是
Staff
,您必须检查的列名是
project\u id
,条件值是
current\u user。project\u id
,所以您必须使用如下条件

Staff.where("project_id = ?", current_user.project_id)
此处
当前用户。项目id
不是员工模型的列。在活动记录
中,其中
期望第一个参数是给定模型的列名。所以这里的模型是
Staff
,您必须检查的列名是
project\u id
,条件值是
current\u user。project\u id
,所以您必须使用如下条件

Staff.where("project_id = ?", current_user.project_id)
您希望执行以下操作:

def索引
@Staff=Staff.where(项目\u id:当前用户.project\u id)
结束
这将执行sql代码
select…from staff,其中staff.project_id=123
,假设当前用户的值为123。之所以会发生这种情况,是因为where方法负责将您提供的键(project\u id)映射到值(current\u user.project\u id的值)

来自where方法的sql将是
select…from staff where current\u user.project\u id=“staff.project\u id”。数据库列应该是where方法的第一部分,值应该是第二部分

您可以将其添加到基本控制器(ApplicationController)中,使其在任何地方都可用,例如:

class ApplicationController
如果要在选择中使用此方法,可以添加以下帮助器方法:

模块应用程序助手
定义选项\u用于\u员工\u项目\u选择(选定=无)
project_id=@staff.collect(:project_id)#从staff获取项目id列表
options=Project.where(id:Project_id).map{{x}[x.name,x.id]}
选项\u为\u选择选项,选中
结束
结束
#在您的表格中,请致电:
您需要执行以下操作:

def索引
@Staff=Staff.where(项目\u id:当前用户.project\u id)
结束
这将执行sql代码
select…from staff,其中staff.project_id=123
,假设当前用户的值为123。之所以会发生这种情况,是因为where方法负责将您提供的键(project\u id)映射到值(current\u user.project\u id的值)

来自where方法的sql将是
select…from staff where current\u user.project\u id=“staff.project\u id”。数据库列应该是where方法的第一部分,值应该是第二部分

您可以将其添加到基本控制器(ApplicationController)中,使其在任何地方都可用,例如:

class ApplicationController
如果要在选择中使用此方法,可以添加以下帮助器方法:

模块应用程序助手
定义选项\u用于\u员工\u项目\u选择(选定=无)
project_id=@staff.collect(:project_id)#从staff获取项目id列表
options=Project.where(id:Project_id).map{{x}[x.name,x.id]}
选项\u为\u选择选项,选中
结束
结束
#在您的表格中,请致电:

使用
Staff.where(“project\u id=?”,当前用户.project\u id)
这就行了!非常感谢。如何将其转换为全局before_action方法以在每个控制器中使用?您可以创建一个可以返回查询的helper方法。然后助手方法将在整个控制器和相应的视图中可用。我添加了一个示例,演示如何使用该方法为use
Staff添加选项。其中(“project\u id=?”,current\u user.project\u id)
有效!非常感谢。如何将其转换为全局before_action方法以在每个控制器中使用?您可以创建一个可以返回查询的helper方法。然后helper方法将在整个控制器和相应的视图中可用。我已经添加了一个示例,演示如何使用它添加选项,感谢jonathan bennetHi,只是一个关于实现的问题:
索引
操作现在是在
当前的\u staff
方法中实现的,它会变成什么?我是否应该恢复到
@Staff=Staff.all
?更新答案。索引操作仍然需要存在才能正常工作,但除非您在今后做更多的工作,否则它将是空的。也非常感谢@jonathan bennetHi,只是一个关于实现的问题:
index
操作现在在
当前的\u员工
方法中实现,它会变成什么?我是否应该恢复到
@Staff=Staff.all
?更新答案。索引操作仍然是n