【问题标题】:Get all articles that a certain user hasn't commented on获取某个用户尚未评论的所有文章
【发布时间】:2015-10-12 10:08:20
【问题描述】:
我有三个模型:文章、评论、用户。
用户可以对文章发表评论。
以下是获取所有完全没有评论的文章的方法,但我只想要某个用户尚未评论过的文章:
Article.includes(:comments).where(:comments => { :id => nil })
更新
class Article
has_many :comments
end
class Comment
belongs_to :article
belongs_to :user
end
class User
has_many : comments
end
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-4
rails-activerecord
【解决方案1】:
#app/models/article.rb
class Article < ActiveRecord::Base
scope :no_user_comments, ->(id) { joins(:comments).where('comments.user_id NOT IN (?)', id) }
end
然后你就可以通过了:
@articles = Article.no_user_comments @user.id
或
@articles = Article.no_user_comments [@user.id, "15", "25"]
【解决方案2】:
我只是不得不面对同样的问题,但提供的答案似乎不起作用:
@articles = Article.joins(:comments).where.not(comments: {user_id: @user.id})
或各种不同的变体,如果他们也被其他用户评论过,也将返回用户评论过的文章。
例如。文章1:user1的commentA,user2的commentB
我发现这个非常不优雅的解决方案:
#app/models/article.rb
class Article < ActiveRecord::Base
has_many :comments
has_many :users, through: :comments #create a many-to-many relations
end
和
@articles = Article.joins(:comments).reject {|f| f.users.where(id: @user.id).present? }
就性能而言,丑陋且非常昂贵(许多 SQL 查询)。拒绝详情请查看详情HERE
希望有人找到更优雅、更高效的方法
【解决方案3】:
试试这个。
Article.joins(:comments).group('article.id').having('count(comments.id) =0')
【解决方案4】:
将此方法添加到文章类
class Article < ActiveRecord::Base
def self.with_no_comments_by(user)
includes(:comments).
references(:comments).
where.not(comments: { user_id: user.id })
end
end