ruby on rails:列出与给定 ID 集不匹配的记录

ruby on rails: list records that does not match a given set of ids

所以,我有三个模型:

class Restaurant < ActiveRecord::Base
  has_many :reviews
  has_many :users, through: :reviews
end

class Review < ActiveRecord::Base
  belongs_to :restaurant
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :reviews
  has_many :restaurants, through: :reviews
end

现在,如果我想列出@user 评论过的所有餐厅,我只需要:

Restaurant.joins(:reviews).where("reviews.user_id": @user.id)

很好。但是,如果我想列出所有未被@user 评论的餐厅怎么办? 我试过这个:

Restaurant.joins(:reviews).where.not(“reviews.user_id": @user.id)

不幸的是,这不起作用,因为它也会 return 那些被@user 评论过的餐厅,这些餐厅已经被其他用户评论过!

我想到了这个可怕而昂贵的黑客:

Restaurant.joins(:reviews).reject {|x| x.users.where(id: @user.id).present? }

我相信一定有更好的方法。帮助!

很简单。

您必须映射@user

评论过的所有餐厅的 ID
reviewed_restaurants = Restaurant.joins(:reviews).where("reviews.user_id": @user.id).map(&:id)

然后触发另一个查询以获取之前选择的餐厅以外的餐厅

@unreviewed_restaurants = Restaurant.where("id not in (?)", reviewed_restaurants)

希望对你有用。