psql根据另一个表排除记录

时间:2013-02-10 05:29:32

标签: ruby-on-rails orm rails-activerecord rails-postgresql

我正在使用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])

2 个答案:

答案 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