【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        • 2014-09-06
        • 2018-08-16
        • 1970-01-01
        • 2015-10-20
        相关资源
        最近更新 更多