我有三种模式:文章,评论,用户。
用户可以对文章发表评论。
以下是如何获取所有没有评论的文章,但我只想要某个用户尚未 评论的文章:
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
答案 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