RoR通过加入,选择和订购过滤掉当前用户

时间:2015-07-31 14:36:57

标签: ruby-on-rails model-view-controller

我在名为nominations的RoR控制器中有以下语句:

@users = User.joins(:department).select("CONCAT(last_name, ', ', first_name, 
   ' - ', name) as user_dept, last_name, first_name, name, 
   users.id").order("last_name, first_name, middle_name")

在视图中,我将此放在下拉列表中:

<%= select_tag "nomination[user_id]", options_from_collection_for_select(@users, 
     :id, :user_dept), prompt: "Select User" %>

我想过滤掉当前用户,以便某人无法提名自己。我已经看过几篇关于使用where.not或scope (for example)的文章,但我能找到的所有语句都是来自一个表的基本选择。如何在保留所有其他内容的同时定义和使用范围?我需要加入和格式化。

编辑 - 每当我在控制器或模型中的任何地方尝试时,我都会收到错误“错误的参数数量(0表示1)”。

3 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

@users = ...
@users = @users.where.not(users: {id: current_user.id})

请注意,在进行连接时需要指定表的名称(而不是模型),否则数据库将不知道它应该查找哪个id列(users.id vs departments.id

在Rails 4之前

not方法是一个很新的东西,并且在Rails 3中不可用。(实际上,在没有参数的情况下不希望调用方法的地方,这就是为什么你得到的错误是unexpected number of arguments (0 for 1) )。

当我们不得不使用以下怪物来完成工作时,那些是黑暗时期:

@users = ...
@users = @users.where('users.id != ?', current_user.id)

答案 1 :(得分:0)

您需要User模型中的范围:

class User < ActiveRecord::Base
  scope :except_id, -> (id) ( where.not(id: id) )
end

然后您可以随意使用它:

@users = User.except_id(current_user.id).joins(:department).select("...")

答案 2 :(得分:0)

    @users = User.where.not(id: current_user.id).joins(:department)
.select("CONCAT(last_name, ', ', first_name, ' - ', name) as user_dept, last_name, first_name, name, users.id")
.order("last_name, first_name, middle_name")