2016-02-27 45 views
0
审查

所以,我有三个型号:Ruby on Rails的4:顶级的饭店不@user

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

这很容易。

你必须通过@user

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

审查那么火另一查询所有餐厅的ID映射之前

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

希望你的作品来获取比其他选择餐馆。

+0

它的工作原理!最令人印象深刻......并快速:)谢谢! –

+0

欢迎您! – techdreams