所以,我有三种模式:
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? }
我确信必须有更好的方法。帮助!
答案 0 :(得分:0)
这很容易。
您必须映射@user
审核的所有餐馆的IDreviewed_restaurants = Restaurant.joins(:reviews).where("reviews.user_id": @user.id).map(&:id)
然后触发另一个查询以获取
之前选择的餐馆以外的餐馆@unreviewed_restaurants = Restaurant.where("id not in (?)", reviewed_restaurants)
希望它适合你。