我正在使用postgres并希望将当前位于一个表中的用户排除在另一个表中。目前我正尝试通过Rails中的ActiveRecord系统来实现这一目标。
所以我需要它从我的可用性表中获取id,然后将该id返回到我的User表中,如果它们在可用性表中,则删除它们。
@availabilities = Availability.where(:event_id => params[:id]).all
@players = User.where('team_id = ? and id <> ?', current_user[:team_id], @availabilities).all
这会返回以下错误
PG::Error: ERROR: argument of WHERE must be type boolean, not type record
LINE 1: SELECT "users".* FROM "users" WHERE (team_id = 1 and id <> ...
^
: SELECT "users".* FROM "users" WHERE (team_id = 1 and id <> 101,102,103)
如下所述改变了代码,虽然我这样做的方式仍然不太理想
@availabilities = Availability.where(:event_id => params[:id]).all
@exclude = Availability.where(:event_id => params[:id]).select(:user_id).pluck(:user_id)
if @exclude.count > 0
@players = User.where('team_id = ? and id NOT IN (?)', current_user[:team_id], @exclude).all
else
@players = User.where('team_id =?', current_user[:team_id])
答案 0 :(得分:4)
你可以这样做:
@availabilities = Availability.where(event_id: params[:id]).pluck(:id)
@players = User.where(team_id: current_user[:team_id])
@players = @players.where('id NOT IN (?)', @availabilities) unless @availabilities.empty?
使用pluck()
会返回一系列ID,然后您可以使用NOT IN (?)
答案 1 :(得分:1)
尝试:
id not in
pg引擎看到它的方式是((team_id = 1和id&lt;&gt; 101),102,103)。因此你看到的错误。
将其用作:
User.where('team_id = ? and id not in (?)', current_user[:team_id], @availabilities).all