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)
希望对你有用。
所以,我有三个模型:
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
评论过的所有餐厅的 IDreviewed_restaurants = Restaurant.joins(:reviews).where("reviews.user_id": @user.id).map(&:id)
然后触发另一个查询以获取之前选择的餐厅以外的餐厅
@unreviewed_restaurants = Restaurant.where("id not in (?)", reviewed_restaurants)
希望对你有用。