我在名为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)”。
答案 0 :(得分:2)
这应该可以解决问题:
@users = ...
@users = @users.where.not(users: {id: current_user.id})
请注意,在进行连接时需要指定表的名称(而不是模型),否则数据库将不知道它应该查找哪个id列(users.id
vs departments.id
)
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")