6

比方说,我们有“主题 - 关系 - 类别”。

即Topic has_many 通过关系分类。

我认为很容易获得具有类别的主题

  #Relationship  Model
  Topic_id: integer
  Category_id: integer

  @topics=Topic.joins(:relationships)

但是,并非每个主题都有一个类别。那么我们如何检索没有类别的主题呢?有减号查询吗?

也许看起来我在相当于 SQL 'minus'@topics=Topic.where('id NOT IN (?)', Relationship.all) 的 activerecord 中找到了它,但不确定这个解决方案。

4

2 回答 2

11

作为一个关系会更好,真的。认为这会起作用:

@topics = Topic.joins('left join relationships on relationships.topic_id = topics.id').where('relationships.category_id is null')

或这个:

@topics = Topic
    .joins('left join relationships on relationships.topic_id = topics.id join categories on categories.id = relationships.category_id')
    .group('topics.id').having('count(categories.id) = 0')
于 2013-03-23T15:26:10.280 回答
4

我一直在寻找最简单的答案,我认为是使用includes.

topics = Topic.includes(:relationships).where(relationships: {id: nil})

另一种更正确的方式,让您认为 SQL 是LEFT OUTER JOINS.

Topic.joins("LEFT OUTER JOINS relationships ON relationships.topic_id = topics.id")
     .where(relationships: {id: nil})
于 2018-02-20T04:37:05.590 回答