在 has_many 关系上应用条件

Applying conditions on has_many relationship

我在使用 rails 4.1.8

从 Postgre 数据库中检索一些数据时遇到问题

让我们考虑两个具有 has_many 关系的模型

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

评论的状态为 approvedcensured

我想在Post模型中写一个方法self.all_comments_approved

我不知道如何获得只有所有评论都获得批准的帖子。 我想写这样的东西(不是工作示例):

def sef.all_comments_approved
  joins(:comments).where("ALL(comments.state = 'approved')").references(:comments)
end

在此先感谢您的帮助:)

您可以尝试将 joinsgrouphaving 语句一起使用,但是您获得的关系将非常脆弱(您将无法进一步查询它,因为随心所欲 - pluck 会完全摧毁它等)。

解决这个问题的方法是将其分成两个数据库调用:

def self.all_comments_approved
  non_approved_ids = joins(:comments).where.not(comments: {state: 'approved'}).uniq.pluck(:id)
  where.not(id: non_approved_ids)
end