0

我正在使用 postgres 并希望从另一个表中排除当前在一个表中的用户。目前我正在尝试通过 Rails 中的 ActiveRecord 系统来做到这一点。

所以我需要它从我的可用性表中获取 id,然后将该 id 返回到我的用户表中以删除它们(如果它们在可用性表中)。

@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])
4

2 回答 2

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 (?)

于 2013-02-10T05:53:50.103 回答
1

尝试:

id not in

pg引擎看到的方式是((team_id=1 and id <> 101), 102, 103)。因此,您看到的错误。

将其用作:

User.where('team_id = ? and id not in (?)', current_user[:team_id], @availabilities).all
于 2013-02-10T05:53:42.447 回答