【问题标题】:ruby on rails: list records that does not match a given set of idsruby on rails:列出与给定 id 集不匹配的记录
【发布时间】:2016-02-27 16:35:28
【问题描述】:

所以,我有三个模型:

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? }

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5


    【解决方案1】:

    这很容易。

    您必须映射@user 评论过的所有餐厅的 ID

    reviewed_restaurants = Restaurant.joins(:reviews).where("reviews.user_id": @user.id).map(&:id)
    

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

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

    希望它对你有用。

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多