获取某个用户尚未评论的所有文章

时间:2015-10-12 10:08:20

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我有三种模式:文章,评论,用户。

用户可以对文章发表评论。

以下是如何获取所有没有评论的文章,​​但我只想要某个用户尚未 评论的文章:

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

4 个答案:

答案 0 :(得分: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"]

答案 1 :(得分:1)

我不得不面对同样的问题,但提供的答案似乎没有起作用:

@articles = Article.joins(:comments).where.not(comments: {user_id: @user.id})

或各种不同的变体,如果其他用户也评论过,也会返回用户评论的文章。 例如。第1条:用户1的评论A,用户2的评论B

我发现这个非常不优雅的解决方案:

#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

希望有人找到更优雅,更有效的方式

答案 2 :(得分:0)

试试这个。

Article.joins(:comments).group('article.id').having('count(comments.id) =0')

答案 3 :(得分:0)

将此方法添加到文章类

class Article < ActiveRecord::Base
  def self.with_no_comments_by(user)
    includes(:comments).
      references(:comments).
      where.not(comments: { user_id: user.id })
  end
end