ruby on rails 4:列出未经@user审核的餐馆

时间:2016-02-27 16:35:29

标签: ruby-on-rails-4

所以,我有三种模式:

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)

不幸的是,这不起作用,因为它还会返回由@user审核过的已被其他用户审核的餐馆!

我想出了这个可怕且昂贵的黑客:

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

我确信必须有更好的方法。帮助!

1 个答案:

答案 0 :(得分:0)

这很容易。

您必须映射@user

审核的所有餐馆的ID
reviewed_restaurants = Restaurant.joins(:reviews).where("reviews.user_id": @user.id).map(&:id)

然后触发另一个查询以获取

之前选择的餐馆以外的餐馆
@unreviewed_restaurants = Restaurant.where("id not in (?)", reviewed_restaurants)

希望它适合你。